当我的Integer []已经初始化时,为什么会出现NullPointerException?

时间:2016-05-11 06:20:35

标签: java sorting nullpointerexception

我试图制作一个代码来回答另一个人的问题......我出现了另一个问题。

这个想法是一个程序,要求你输入数字,以便对它们进行排序并从高到低打印出来。

这就是我的意思:

public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    System.out.println("Input: ");
    Integer input = new Integer(Integer.parseInt(scanner.nextLine()));
    scanner.close();
    Integer[] numbers = new Integer[input.toString().length()];

    for (Integer value : numbers) {
        while (input > 1) {
            value = input % 10;
            input /= 10;
        }
    }

    Arrays.sort(numbers, Collections.reverseOrder());

    int a = 0;
    for (Integer value : numbers) {
        if (a < numbers.toString().length()) {
            System.out.print(value + ", ");
            a++;
        } else {
            System.out.println(value + ".");
        }
    }
}

但是,输入是Input: 292816374,这就是控制台所说的:

Exception in thread "main" java.lang.NullPointerException
at java.util.Collections$ReverseComparator.compare(Unknown Source)
at java.util.Collections$ReverseComparator.compare(Unknown Source)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at StartingPoint.main(StartingPoint.java:21)

问题在于它正在尝试对null整数进行排序,但我不知道为什么它在已经初始化时会将numbers检测为空数组。 如果我将Integer更改为int s,则没有例外情况,但会打印出零。

为什么会这样?

3 个答案:

答案 0 :(得分:6)

您已使用

创建了数组
Integer[] numbers = new Integer[input.toString().length()];

Integer是一种对象类型,因此数组中的所有值都以null开头。如果它是int,那么它将是一个基元数组,它们都将初始化为0。

如果您想更新数组值,请尝试

 for (int x = 0; x < numbers.length; x++) {

      numbers [x] = value; // whatever
 }

答案 1 :(得分:2)

for (Integer value : numbers) {
    while (input > 1) {
        value = input % 10;
        input /= 10;
    }
}

value = input % 10;没有做你期望的事情:它不会在数组中设置值。它就像:

Integer i = numbers[0];  // assuming numbers[0] is 0 at this moment
i = 100;
// numbers[0] is STILL 0

您必须明确地为数组赋值。

建议做你想做的事情是这样的:

int i = 0;
while (input > 0) {
    numbers[i++] = (input % 10);
    input /= 10;
}

答案 2 :(得分:1)

您已创建数组但未向数组指定值。

在增强的for循环中,您将值分配给value变量,该变量将不存储数组,您需要手动将值存储到数组中。

请尝试以下代码:

int index = 0;
for (Integer value : numbers) {
    while (input > 1) {
        value = input % 10;
        input /= 10;

        // assigning value back to numbers array
        numbers[index] = value;
        index++;
    }
}