我立即收到源自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中的错误的图形:
这是更新且正常运行的代码:
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)
答案 0 :(得分:3)
使用quizList.add(qz[i]);
代替quizList.set(i, qz[i]);
您的列表在您想要将对象设置为特定位置的位置为空。
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)