0

运行此冒泡排序时出现空指针异常,我不确定为什么,有人可以解释一下这个问题吗?

for(int i = 1; i < clipArray.length; i++) {
    for(int j = 0; j < clipArray.length - 1; j++) {
        if(((clipArray[j].getSurname()).compareToIgnoreCase((clipArray[j+1].getSurname()))) > 0) {
            Clip temp = clipArray[j];
            clipArray[j] = clipArray[j+1];
            clipArray[j+1] = temp;
        }
    }
}
for(int g = 0; g < clipArray.length; g++) {
    System.out.println(clipArray[g].getSurname());
}

我正在尝试打印出数组中对象的姓氏。

我用数组中的 2 个元素对其进行了测试,所有其他元素都为空。

异常发生在第三行的 if 语句中。

4

3 回答 3

0

缩短 clipArray,使长度与非空元素的数量相匹配。然后你就不会试图读入一个空元素。如果您想在读取姓氏时增加数组,可以使用 Java Collections API 中的 ArrayList 类的实例。

此外,不确定您是否关心,但比在外部循环中进行不必要的迭代更有效的是执行 while(flag),如果没有交换,则 flag 设置为 false。像这里的东西:

http://mathbits.com/MathBits/Java/arrays/Bubble.htm

于 2013-10-25T03:32:22.307 回答
0

也许这是编写冒泡排序的学术实验,但如果不是,则无需编写自己的排序算法。Arrays.sort可以轻松地对其或其中的任何部分进行排序:

Arrays.sort(clipArray, 0, 2, new Comparator<Clip>() {
    public int compare(Clip c1, Clip c2) {
        return c1.getSurname().compareToIgnoreCase(c2.getSurname());
    }
});
于 2013-10-25T03:43:43.380 回答
0

这里的问题是您仍在访问排序中的那些空元素。我假设您的数组不仅仅是 2 个元素。相反,我会在该 if 语句中包含另一个条件,以判断对象是否为空。

if(clipArray[i] != null && clipArray[j] != null && ...Rest of your statements here)

或者事先跟踪有多少元素。所以有一个int知道只有2个元素的人。并循环直到你击中它。

Java 实际上为您提供了一种通过 ArrayList 执行此操作的方法。文档可以在这里找到。而不是遍历长度,只需调用.size().

于 2013-10-25T03:27:57.190 回答