我该如何调试下面的代码?

时间:2015-02-15 06:55:17

标签: java

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;
        }

3 个答案:

答案 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.