Java 如何调试下面的代码?
smb能帮助我为什么在这个方法中得到NullPointerException吗?该方法应该对文本文件中的数据进行排序。空指针在行中Java 如何调试下面的代码?,java,Java,smb能帮助我为什么在这个方法中得到NullPointerException吗?该方法应该对文本文件中的数据进行排序。空指针在行中 r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore()); r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].get
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
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;
}
公共静态考试[]对比考试(考试[]考试)
{
考试[]r=新考试[考试.长度];
int指数=0;
for(int i=0;i
我认为
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(),...
应该是
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
r[index] = new Exam( exams[i].getFirstName(), exams[i].getLastName(),...
用于从输入数组复制/重新创建另一个检查
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
此外,
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
index += 2;
我看不太对。您可以在以下行中初始化一个空的检查数组:
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
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());
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
我认为您希望读取从数组“exames”而不是“r”传递给构造函数的信息:
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
调试代码的最佳方法是使用IDE,如Intellij、eclipse、Netbeans等
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
多个问题:
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
- 您刚刚定义了数组,但从未初始化它。默认情况下,每个数组元素都将为null,并且您正在尝试执行
,这就是您获取NullPointerException的原因。对null对象的任何方法调用都会导致null指针异常,就像您的情况一样。因此,您可以从数组中初始化数组元素,该数组可能作为方法的n个输入r[i]。获取…
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
r[index] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
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.
在初始化数组元素之前,您正在使用它们。看看
index
和i
都等于零时会发生什么。我现在为您发布了几个工作示例。我有一个多循环的例子,你说你不能使用,因为有多个循环。然后,我提出了一种多维数组方法,虽然它的效率根本不符合您的标准。即使这两者都不是您所需要的,至少代码在这两种情况下都能工作。。。