相对于构造函数抛出的越界运行时错误

时间:2014-05-19 12:22:18

标签: java arrays object arraylist runtime-error

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

错误内容如下:

  

java.lang.IndexOutOfBoundsException:Index:0,Size:0

     
    

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

         

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

         

at Student。(Student.java:11)​​

         

在TestStudent.main(TestStudent.java:5)

  

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

run-time error

这是更新且正常运行的代码:

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

     
    

at Student。(Student.java:9)

         

在TestStudent.main(TestStudent.java:5)

  

Updated error

3 个答案:

答案 0 :(得分:3)

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

documentation of set

  

IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; = size())

到您的更新:

您删除了行quizList = new ArrayList<Integer>(5);。它初始化您的列表。您需要将此行放在适当的位置,否则您没有可以添加对象的列表。 NullPointerException总是意味着没有想要读取/写入对象的对象。

答案 1 :(得分:1)

ArrayList<>(int i) 使ArrayList的初始大小为i,方式与int[5]使数组的初始长度相同i。它的作用是将内部支持数组的大小初始化为i,同时使实际的ArrayList完全为空。出于所有意图和目的,您的ArrayList是一个没有元素的空数组。

因此,当您尝试将ArrayList中的任何元素设置为其他内容时,存在一个小问题没有任何内容可以设置,因为其中没有任何内容< / em>的。

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

答案 2 :(得分:0)

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

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