我试图在java中创建一个简单的小方法,它将从我给它的任何输入创建一个递减整数值列表(例如,如果N = 10,它将返回一个数组:{10 ,9,8,7,6,6,5,4,3,2,1}。这是我的代码的一小部分,它正确编译,但我在运行时得到空指针异常。是否有在下面的代码中突出的任何问题?
def [](row, col)
答案 0 :(得分:1)
您在每次迭代时将q
初始化为0
。为什么不
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = N; i >= 1; i--) {
a[i-1] = N - i + 1;
}
return a;
}
或者,您可以使用
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = 0; i < N; i++) {
a[i] = N - i;
}
return a;
}
哪个更清楚
答案 1 :(得分:1)
您不应该获得空指针异常,您的代码具有索引超出范围的异常。这是因为您将i
从N
向下运行到1
,这是排他性的,而它应该从N-1
向下运行到0
:
for(int i = N-1, q=0; i >= 0; i--, q++) {
a[q] = i+1;
}
注意如何在循环的标题中声明q
和i
。
您也可以在不使用q
的情况下重写此循环:
for(int i = 0 ; i != N ; i++) {
a[q] = N-i;
}
答案 2 :(得分:0)
通过反复重新声明0
,您反复覆盖数组的q
位置。这是修复:
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = N; i > 1; i--) {
a[q] = i;
q++;
}
return a;
}
答案 3 :(得分:0)
N是上限。大小为N的java中的数组从0到N-1索引。因此,当您引用[N]时,它将引用超出范围的索引。
答案 4 :(得分:0)
现在的代码将返回一个大小为N
的数组,但只有数组的第一个元素会更新十次。这就是为什么我们通过你的程序的逻辑,
create an array of type Integer, sized N
First iteration:
for-loop starts at i=N, let's make N = 10 for our purposes
q is set to 0 and a[0] is updated to N, which is 10 in the first iteration
q is incremented to 1
i is decremented to 9
Second iteration:
i is now 9
q is set to 0 and a[0] is set to 9
q is incremented to 1
i is decremented to 8
此时我们可以看到问题所在。您可能认为第二次迭代中的q
应该从1开始,并在更新a[1]
而不是a[0]
后增加到2,但事实并非如此。对于for循环的每次迭代,都会生成一个新变量q
。迭代结束后,变量q
被垃圾收集/抛出。因此,解决方案是使用在for循环的每次迭代之后未抛出的变量。因此,让我们使用i
来访问数组中的特定索引,因为
1)循环的每次迭代都可以访问相同的变量i
2)变量i
在每次迭代结束时自动递增或递减,具体取决于循环标题
因此,应用这些更改将导致此
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = 0; i < N; i++) {
a[i] = N - i;
}
return a;
}
答案 5 :(得分:0)
您的代码应如下所示:
public static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = N - 1; i >= 0; i--) {
a[q] = i + 1;
q++;
}
return a;
}
你必须在for循环之外初始化q,因为每次循环时,q都会初始化为零,它变为[0] = 10,a [0] = 9等等......