Java 如何调试下面的代码?

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

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].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,并且您正在尝试执行
    r[i]。获取…
    ,这就是您获取NullPointerException的原因。对null对象的任何方法调用都会导致null指针异常,就像您的情况一样。因此,您可以从数组中初始化数组元素,该数组可能作为方法的n个输入

  • 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
都等于零时会发生什么。我现在为您发布了几个工作示例。我有一个多循环的例子,你说你不能使用,因为有多个循环。然后,我提出了一种多维数组方法,虽然它的效率根本不符合您的标准。即使这两者都不是您所需要的,至少代码在这两种情况下都能工作。。。