2016-09-25 140 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等...