【问题标题】:Why do I get NullPointerException when my Integer[] has already been initialized? [duplicate]为什么我的 Integer[] 已经初始化后会出现 NullPointerException? [复制]
【发布时间】:2016-09-06 08:59:28
【问题描述】:

我试图编写一个代码来回答另一个人的问题......但我又遇到了另一个问题。

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

这是我带来的:

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 检测为空数组。 如果我将 Integers 更改为 ints 没有例外,但它会打印出零。

为什么会这样?

【问题讨论】:

  • 它不能重复,因为我确实初始化了数组。
  • 您正在使用 forecah 迭代数字,但您已将长度分配给 input[](好的部分),而您的 number[] 为空(坏部分)
  • 问题是因为我试图通过引用而不是明确提及它们来分配每个numbers 的字段。这就是为什么numbers 是空的。

标签: java sorting nullpointerexception


【解决方案1】:

你已经创建了数组

Integer[] numbers = new Integer[input.toString().length()];

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

如你想更新数组值试试

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

      numbers [x] = value; // whatever
 }

【讨论】:

  • 在那行代码中我正在做的是设置numberss 的大小。我在增强的for 循环中初始化它。
  • @JavaNoob 你没有在for 循环中初始化它们。见this
  • “你不能遍历不存在的值”你可以。您只是简单地通过带有nulls 的数组进行迭代,因此value 只是null 对于每次迭代。当然原来的逻辑还是有缺陷的,但是你的解释是错误的。甚至 OP 已经用Integer 实例初始化了数组,他通过循环填充数据的方式仍然是错误的,并且没有给出正确的结果。
  • @ScaryWombat 所以我的问题是因为我试图通过引用分配每个numbers 的字段,而不是通过提及每个字段来做到这一点。谢谢!
  • @AdrianShum 是的,我没有解释清楚。
【解决方案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;
}

【讨论】:

    【解决方案3】:

    你已经创建了数组,但是你没有给数组赋值。

    在您增强的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++;
        }
    }
    

    【讨论】:

    • 谢谢。这可以通过将引用变量value 的值分配给每个numbers 的字段来解决我的问题。不过,如果我只使用普通的for 循环并直接分配每个numbers 的字段,它会更短。
    • Normal for 并直接为其分配数字数组肯定会缩短代码,但在我的回答中,我使用了您的代码,以便您可以轻松了解您缺少的内容.. :)
    • 没错。我只是指出,以防遇到同样问题的人看到这个;你的回答很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多