【问题标题】:Out-of-bounds run-time error thrown relative to constructor相对于构造函数抛出的越界运行时错误
【发布时间】:2014-07-07 09:46:02
【问题描述】:

我立即收到源自我的Student 类构造函数的运行时错误。这是我知道的唯一错误,但可能还有更多。

错误内容如下:

java.lang.IndexOutOfBoundsException:索引:0,大小:0

在 java.util.ArrayList.rangeCheck(ArrayList.java:635)

在 java.util.ArrayList.set(ArrayList.java:426)

在Student.(Student.java:11)

在 TestStudent.main(TestStudent.java:5)

在我的 IDE 中显示错误的图形:

这是更新后的代码:

import java.util.*;
public class Student {
    private String name;
    private ArrayList<Integer> quizList = new ArrayList<Integer>(5);
    public Student(String name, int qz1, int qz2, int qz3, int qz4, int qz5) {
        this.name = name;
        int qz[] = {qz1, qz2, qz3, qz4, qz5};
        for(int i = 0; i < qz.length; i++) {
            quizList.add(qz[i]);
        }
    }

    public String getName() {
        return name;
    }

    public String setName(String name) {
        return this.name = name;
    }

    public ArrayList<Integer> getQuizList() {
        return quizList;
    }

    public int getQuiz(int location) {
        return quizList.get(location);
    }

    public void setQuiz(int location, int qz) {
        quizList.set(location, qz);
    }
}

import java.util.*;
public class TestStudent {
    public static void main(String [] args) {
        ArrayList<Student> list = new ArrayList<Student>();
        list.add(new Student("Mark Kennedy", 70, 80, 90, 100, 90));
        list.add(new Student("Max Gerard", 80, 85, 90, 85, 80));
        list.add(new Student("Jean Smith", 50, 79, 89, 99, 100));
        list.add(new Student("Betty Farm", 85, 80, 85, 88, 89));
        list.add(new Student("Dilbert Gamme", 70, 70, 90, 70, 80));

        printBook(list);
    }

    public static void printBook(ArrayList<Student> list) {
        for(Student token : list) {
            System.out.print(token.getName() + "\t");
            for(int i = 0; i < 5; i++) {
                System.out.printf("%5d\t", token.getQuiz(i));
            }
            System.out.println();
        }
    }

    public static void replaceName(ArrayList<Student> list, String find, String replace) {
        int position = 0;
        int values[] = new int[5];
        for(int i = 0; i < list.size(); i++) {
            values[i] = list.get(i).getQuiz(i);
        }
        for(int i = 0; i < list.size(); i++) {
            if (list.get(i).getName().equals(find)) {
                list.get(i).setName(replace);
            }
        }
    }

    public static void replaceQuiz(ArrayList<Student> list, String find, int quizNum, int replace) {
        for(int i = 0; i < list.size(); i++) {
            if (list.get(i).getName().equals(find)) {
               list.get(i).setQuiz((quizNum-1), replace);
            }
        }
    }

    public static void replaceStudent(ArrayList<Student> list, String find, Student replacement) {
        insertStudent(list, find, replacement.getName());
        deleteStudent(list, find);
    }

    public static void insertStudent(ArrayList<Student> list, String find, String name) {
        int position = 0;
        int values[] = new int[5];
        for(int i = 0; i < list.size(); i++) {
            values[i] = list.get(i).getQuiz(i);
        }
        for(int i = 0; i < list.size(); i++) {
            if(list.get(i).getName().equals(find)) {
                position = i;
            }
        }
        list.add(position, new Student(name, values[0], values[1], values[2], values[3], values[4]));
    }

    public static void deleteStudent(ArrayList<Student> list, String find) {
        int location = 0;
        int i;
        for(i = 0; i < list.size(); i++) {
            if (list.get(i).getName().equals(find)) {
                location = i;
                break;
            }
        }
        if (i != list.size()) {
            list.remove(location);
        }
    }
}

更新:

修改了Student中的一点代码:

    private String name;
    private ArrayList<Integer> quizList;
    public Student(String name, int qz1, int qz2, int qz3, int qz4, int qz5) {
        this.name = name;
        int qz[] = {qz1, qz2, qz3, qz4, qz5};
        for(int i = 0; i < qz.length; i++) {
            quizList.add(qz[i]);
        }
    }

现在抛出此错误:

java.lang.NullPointerException

在Student.(Student.java:9)

在 TestStudent.main(TestStudent.java:5)

【问题讨论】:

  • 您只能将对象保存到数组列表中,不能保存原始数据类型值
  • @RajeshKumar 自动装箱

标签: java arrays object arraylist runtime-error


【解决方案1】:

使用quizList.add(qz[i]); 而不是quizList.set(i, qz[i]); 在您要将对象设置到特定位置的位置,您的列表为空。

documentation of set:

IndexOutOfBoundsException - 如果索引超出范围 (index = size())

到您的更新:

您删除了quizList = new ArrayList&lt;Integer&gt;(5); 行。它初始化您的列表。您需要将这条线放在适当的位置,否则没有可以将对象添加到的列表。 NullPointerException 始终意味着在您想要读取/写入对象时未创建对象。

【讨论】:

  • java.lang.NullPointerException at Student.&lt;init&gt;(Student.java:10) at TestStudent.main(TestStudent.java:5)
  • 知道是什么导致了这个 NullPointerException 吗?
  • @alx:查看我的更新。您需要将这条线 quizList = new ArrayList&lt;Integer&gt;(5); 固定到位。
  • 谢谢你的帮助和友善。至少有一些社区成员喜欢提供帮助,并且不会因为经验不足而对他人投反对票。
【解决方案2】:

带有 int 的 ArrayList 构造函数指定初始容量,而不是大小。大小仍然为零,因为 arraylist 中没有元素。这就是 set 方法失败的原因,因为它首先检查大小。为什么不直接使用 add() 呢?

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#set(int, E)

【讨论】:

    【解决方案3】:

    ArrayList&lt;&gt;(int i)使您的ArrayList 具有i 的初始大小,就像int[5] 使数组具有i 的初始长度一样。它所做的是将内部支持数组 的大小初始化为i,同时将实际的ArrayList 完全留空。出于所有意图和目的,您的 ArrayList 是一个没有元素的空数组。

    因此,当您尝试将 ArrayList 中的任何元素设置为其他内容时,会有一个小问题 没有可设置的内容,因为 其中没有任何内容

    您必须先向 ArrayList 添加元素,然后才能将其中的元素更改为其他内容。

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2020-09-04
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多