简单减少阵列混乱

时间:2016-09-25 22:50:17

标签: java arrays

我试图在java中创建一个简单的小方法,它将从我给它的任何输入创建一个递减整数值列表(例如,如果N = 10,它将返回一个数组:{10 ,9,8,7,6,6,5,4,3,2,1}。这是我的代码的一小部分,它正确编译,但我在运行时得到空指针异常。是否有在下面的代码中突出的任何问题?

def [](row, col)

6 个答案:

答案 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)

您不应该获得空指针异常,您的代码具有索引超出范围的异常。这是因为您将iN向下运行到1,这是排他性的,而它应该从N-1向下运行到0

for(int i = N-1, q=0; i >= 0; i--, q++) {
    a[q] = i+1;
}

注意如何在循环的标题中声明qi

您也可以在不使用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等等......