Java 相对于构造函数引发的越界运行时错误
我立即得到一个源于我的Java 相对于构造函数引发的越界运行时错误,java,arrays,object,arraylist,runtime-error,Java,Arrays,Object,Arraylist,Runtime Error,我立即得到一个源于我的学生类构造函数的运行时错误。这是我意识到的唯一一个错误,但可能还有更多 错误内容如下: java.lang.IndexOutOfBoundsException:索引:0,大小:0 位于java.util.ArrayList.rangeCheck(ArrayList.java:635) 位于java.util.ArrayList.set(ArrayList.java:426) 学生时代。(Student.java:11) 位于TestStudent.main(TestStud
学生类构造函数的运行时错误。这是我意识到的唯一一个错误,但可能还有更多
错误内容如下:
java.lang.IndexOutOfBoundsException:索引:0,大小:0
位于java.util.ArrayList.rangeCheck(ArrayList.java:635)
位于java.util.ArrayList.set(ArrayList.java:426)
学生时代。(Student.java:11)
位于TestStudent.main(TestStudent.java:5)
显示my 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);
}
}
}
现在抛出此错误:
java.lang.NullPointerException
学生时代。(Student.java:9)
位于TestStudent.main(TestStudent.java:5)
ArrayList(int i)
不会使您的ArrayList
具有i
的初始大小,就像int[5]
使数组具有i
的初始长度一样。它所做的是将内部支持数组的大小初始化为i
,同时将实际的ArrayList
完全保留为空。出于所有目的,您的ArrayList
是一个没有元素的空数组
因此,当您尝试将ArrayList
中的任何元素设置为其他元素时,会出现一个小问题,即没有可设置的元素,因为其中没有任何元素
您必须先将元素添加到ArrayList
中,然后才能将其中的元素更改为其他内容。ArrayList(int i)
不会使ArrayList
的初始大小为i
与int[5]
使数组的初始长度为i
相同。它所做的是将内部支持数组的大小初始化为i
,同时将实际的ArrayList
完全保留为空。出于所有目的,您的ArrayList
是一个没有元素的空数组
因此,当您尝试将ArrayList
中的任何元素设置为其他元素时,会出现一个小问题,即没有可设置的元素,因为其中没有任何元素
您必须先将元素添加到ArrayList
,然后才能将其中的元素更改为其他内容。使用quizList.add(qz[i])
而不是quizList.set(i,qz[i])代码>要将对象设置到特定位置的点处的列表为空
:
IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>=size())
要更新,请执行以下操作:
您删除了行quizList=newarraylist(5)代码>。它会初始化您的列表。您需要将这一行放在适当的位置,否则没有可以添加对象的列表。NullPointerException
始终表示未创建对象,您希望从中读取/写入对象。使用quizList.add(qz[i])
而不是quizList.set(i,qz[i])代码>要将对象设置到特定位置的点处的列表为空
:
IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>=size())
要更新,请执行以下操作:
您删除了行quizList=newarraylist(5)代码>。它会初始化您的列表。您需要将这一行放在适当的位置,否则没有可以添加对象的列表。NullPointerException
始终表示未创建要从中读取/写入的对象。带有int的ArrayList构造函数指定初始容量,而不是大小。由于arraylist中没有元素,因此大小仍然为零。这就是set方法失败的原因,因为它首先检查大小。为什么不改用add()呢
,E)带有int的ArrayList构造函数指定初始容量,而不是大小。由于arraylist中没有元素,因此大小仍然为零。这就是set方法失败的原因,因为它首先检查大小。为什么不改用add()呢
,E)您只能将对象保存到arraylist,而不能保存原始数据类型values@RajeshKumar自动装箱您只能将对象保存到arraylist,而不能保存原始数据类型values@RajeshKumar学生处的自动装箱java.lang.NullPointerException。(Student.java:10)TestStudent.main(TestStudent.java:5)
知道是什么导致了这个NullPointerException吗?@alx:请看我的更新。您需要ceep这一行quizList=newarraylist(5)代码>到位。谢谢你的帮助和友好。至少一些社区成员喜欢提供帮助,并且不会因为人们缺乏经验而投票反对。java.lang.NullPointerException At Student.(Student.java:10)At TestStudent.main(TestStudent.java:5)
知道是什么导致了这种NullPointerException吗?@alx:查看我的更新。您需要ceep这一行quizList=newarraylist(5)代码>到位。谢谢你的帮助和友好。至少有一些社区成员喜欢帮忙,不会因为人们经验不足而投票反对。
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]);
}
}