Java 尝试合并类的排序数组时获取空指针异常

Java 尝试合并类的排序数组时获取空指针异常,java,arrays,sorting,mergesort,Java,Arrays,Sorting,Mergesort,我有一个结构良好的类,名为General,包含ID、name和age的变量。两个整数和一个字符串。然后我有一个GeneralRosters类,它打开一个可序列化的文件,读入记录,对记录进行排序,然后关闭文件。我使用一个单独的MergeSort类对记录进行排序。每当我运行我的测试程序时,我总是为我的MergeSort类得到一个空指针异常。我知道记录被正确地读入数组,因为读入后我可以输出整个列表。知道怎么回事吗?我将把我的代码粘贴到下面。 在从数据[leftIndex]和数据[rightIndex

我有一个结构良好的类,名为General,包含ID、name和age的变量。两个整数和一个字符串。然后我有一个GeneralRosters类,它打开一个可序列化的文件,读入记录,对记录进行排序,然后关闭文件。我使用一个单独的MergeSort类对记录进行排序。每当我运行我的测试程序时,我总是为我的MergeSort类得到一个空指针异常。我知道记录被正确地读入数组,因为读入后我可以输出整个列表。知道怎么回事吗?我将把我的代码粘贴到下面。


在从
数据[leftIndex]
数据[rightIndex]
中访问数据之前,您没有检查
null

替换

if(data[leftIndex].getID() <= data[rightIndex].getID()) {
    combined[combinedIndex++] = data[leftIndex++];
}
while(true) {
    record = (General) input.readObject();


@ArvindKumarAvinash我发送给排序方法的数组不是空的,所以我不知道为什么会出现错误。在图像中,它显示了输出到控制台的数组中的所有记录。能否尝试添加
System.out.printf(“%-12d%-20s%-12d\n”、花名册[count-1].getID()、花名册[count-1].getName()、花名册[count-1].getAge())就在读取循环中原始
系统输出.printf
之后?它打印的是什么?对不起,在第一次编辑中,您在阅读循环中用
花名册[count]
替换了
花名册[0]
;您是否对代码应用了相同的更改?使用
花名册[0]
可以解释
花名册
数组中的
-s,即使每个
记录
都不是
并且可以打印出来。我做了建议的更改,但不幸的是,我仍然得到相同的错误message@ConnorS. - 我已经更新了答案。我希望,它能解决你的问题。它现在似乎起作用了。在我做了这些更改之后,它一开始不起作用,但是eclipse试图运行一个旧版本。谢谢你的帮助。但是,等等,@ConnorS.,你知道为什么数组中有
null
-s吗?@sainaen Eclipse运行的是我的一个较旧版本的程序,它没有任何我所做的更改。我的串行文件没有任何空值,因此代码中发生了一些更改。很可能它在我的readRecord方法中仍然使用花名册[0],而不是花名册[count]。很抱歉给你带来了困惑。
public class MergeSort {
    public void sort(General[] data, int low, int high) {
        if ((high - low) >= 1) {
            int middle1 = (low + high) / 2;
            int middle2 = middle1 + 1;

            sort(data, low, middle1);
            sort(data, middle2, high);

            merge(data, low, middle1, middle2, high);
        }
    }

    public void merge(General[] data, int left, int middle1, int middle2, int right) {
        int leftIndex = left;
        int rightIndex = middle2;
        int combinedIndex = left;
        General[] combined = new General[data.length];

        while (leftIndex <= middle1 && rightIndex <= right) {
            if(data[leftIndex].getID() <= data[rightIndex].getID()) {
                combined[combinedIndex++] = data[leftIndex++];
            }else {
                combined[combinedIndex++] = data[rightIndex++];
            }
        }
        if(leftIndex == middle2) {
            while(rightIndex <= right) {
                combined[combinedIndex++] = data[rightIndex++];
            }
        }else {
            while(leftIndex <= middle1) {
                combined[combinedIndex++] = data[leftIndex++];
            }
        }

        for(int i = left; i <= right; i++) {
            data[i] = combined[i];
        }
    }
}
public class GeneralRostersTest
{
    public static void main( String[] args )
    {
        GeneralRosters application = new GeneralRosters();
        application.openFile();
        application.readRecords();
        application.closeFile();
        application.sortRoster();
    }
}
if(data[leftIndex].getID() <= data[rightIndex].getID()) {
    combined[combinedIndex++] = data[leftIndex++];
}
if(data[leftIndex] != null && data[rightIndex] != null) {
    if(data[leftIndex].getID() <= data[rightIndex].getID()) {
        combined[combinedIndex++] = data[leftIndex++];
    }
}
while(true) {
    record = (General) input.readObject();
while((record = (General) input.readObject()) != null) {