smb可以帮助我在这个方法中获得NullPointerException吗?该方法应该对文本文件中的数据进行排序。空指针在行
中r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
public static Exam[] collateExams(Exam[] exams)
{
Exam[] r = new Exam[exams.length];
int index = 0;
for (int i = 0; i < exams.length; i++)
{
if(exams[i].getExamType() == 'm')
{
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
for(int j = 0; j < exams.length; j++)
{
if((exams[j].getExamType() == 'f') && exams[i].getLastName().equals(exams[j].getLastName()))
{
r[index+1] = new Exam(r[j].getFirstName(), r[j].getLastName(), r[j].getID(), r[j].getExamType(), r[j].getScore());
}
}
}
index+=2;
}
return r;
}
答案 0 :(得分:1)
我认为
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(),...
应该是
r[index] = new Exam( exams[i].getFirstName(), exams[i].getLastName(),...
从输入数组中复制/重新创建另一个Exam。
另外,
index += 2;
看起来不对我。
答案 1 :(得分:1)
您在以下行中初始化一个空的Exam-array:
Exam[] r = new Exam[exams.length];
然后,您尝试在第一次循环迭代中访问索引0处的对象,但在第一次循环迭代中,数组r中没有项目。所以你得到了NPE:
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
我想你想要从数组&#34;考试&#34;中读取传递给构造函数的信息。而不是&#34; r&#34;:
r[index] = new Exam(exams[i].getFirstName(), exams[i].getLastName(), exams[i].getID(), exams[i].getExamType(), exams[i].getScore());
答案 2 :(得分:1)
调试代码的最佳方法是使用IDE,如Intellij,eclipse,Netbeans等。
多个问题:
您刚刚定义了数组并且从未初始化它。默认情况下,每个数组元素都将为null,并且您正在尝试执行r[i].get...
,这就是您获得NullPointerException的原因。对null对象的任何方法调用都会导致空指针异常,就像你的情况一样。因此,你可以从你作为方法输入的exams数组中初始化数组元素。
从上面的代码看,如果你的数组中有两个考试。现在考虑它将如何运行:
Pass 1:
index = 0
i = 0
r[index] = new ... which is fine as index is 0
index += 2 so now index is 2
Pass 2:
i = 1
r[index] = new ... since you defined r as Exam[] r = new Exam[exams.length]; which means you could just access r[0] and r[1] and now you are trying to set r[2] which is not valid.