我试图制作一个代码来回答另一个人的问题......我出现了另一个问题。
这个想法是一个程序,要求你输入数字,以便对它们进行排序并从高到低打印出来。
这就是我的意思:
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,则没有例外情况,但会打印出零。
为什么会这样?
答案 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++;
}
}