2016-09-25 112 views
-3

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

private static Integer[] descendingIntegerArray(int N) { 
    Integer[] a = new Integer[N]; 
    for(int i = N; i > 1; i--) { 
     int q = 0; 
     a[q] = i; 
     q++; 
    } 
    return a; 
} ` 

回答

1

您在每次迭代初始化q0,为什么不

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

你不应该得到空指针异常,你的代码中有一个索引超出范围的例外。这是因为你运行你iN1,排他的,而应该从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; 
} 
0

您多次反复重新声明q覆盖您的阵列的0位置。这是修复:

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; 
} 
0

N是上限。 java中大小为N的数组索引从0到N-1。所以当你引用一个[N]时,它会引用一个超出范围的索引。

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; 
} 
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,一[0] = 9等...