2

这是一个相当基本的java问题

我有一个包含字符串的数组,我想使用 java.util.Arrays.sort 对其进行排序

当我写

String[] myArray = {"A","B","C"};
java.util.Arrays.sort(myArray);

它被正确排序

但是当我有

String[] myArray = new String[10];
myArray[0] = "A";
myArray[1] = "B";
myArray[2] = "C";

java.util.Arrays.sort(myArray);

排序抛出一个空引用异常

我很确定它真的很愚蠢,我只是现在不明白。我必须新的字符串,因为硬编码默认值不会让任何人,任何地方。

4

9 回答 9

7

初始化第二个数组时,只初始化前三个元素。其他元素初始化为 null,因此无法排序。

于 2009-02-02T04:28:24.220 回答
3

在源代码中,该方法使用 compareTo() 作为排序条件。显然,在null上调用 compareTo()会引发 NullPointerException。正如它在 Java Docs 中提到的那样,

数组中的所有元素必须相互比较(即 e1.compareTo(e2) 不得为数组中的任何元素 e1 和 e2 抛出 ClassCastException)

当然,这里不是关于 ClassCastException,但对comapreTo() 的调用是显而易见的。

[已编辑]

PS 从异常堆栈跟踪中找出这一点是您最好的选择。

于 2009-02-02T04:46:54.650 回答
3

尝试以下仅对前三个元素进行排序。

Arrays.sort(myArray, 0, 3);
于 2009-02-02T08:47:11.453 回答
1

发生的情况是,当您拥有包含十个项目的数组时,其他项目未初始化。因此,当排序算法工作时,它会尝试获取字符串的值,但什么也得不到,并抛出异常。

您需要确保不要尝试对空间比放入其中的内容更多的数组进行排序。

于 2009-02-02T04:28:35.280 回答
1

我认为,由于您myArray存储了 10 个元素,因此它(有效地)在末尾添加了 7 个空值,然后Arrays.sort()无法针对字符串对空元素进行排序。

于 2009-02-02T04:28:36.870 回答
1

它无法处理最初创建数组时存在的空字符串。为了避免要么明确地将所有内容设为“”,要么根据需要分配。

虽然不知道这是否是 API 级别的失误,因为他们可以满足空对象(我们在 SQL orderby 中获取的方式)或者还有更多内容。

于 2009-02-02T04:37:03.657 回答
0

您将数组大小定义为 10,但仅初始化 3 个索引。将数组大小更改为 3 或初始化所有十个。

于 2009-02-02T04:29:23.330 回答
0

该数组有 10 个项目,但你只在里面放了 3 个。因此,其他 7 个为 NULL。考虑改用 ArrayList。

于 2009-02-02T04:30:29.613 回答
-1

应该使用数组列表,因为有 3 个元素而不是 10 个。

数组的其他 7 个元素将具有空值。

正是这些空值在排序时导致空指针问题。

于 2015-10-05T04:34:15.247 回答