2012-11-19 18 views
0

我目前在大小爲4,2的二維數組中使用嵌套for循環。 當我運行我的程序,我在下面的行使用!null進行嵌套循環錯誤檢查不存在的元素

else if (state[i][j+1] != null 
      && state[i][j].getFlash() <= state[i][j].getCycleLength() 
      && state[i][j+1].getCycleLength() == state[i][j].getCycleLength()){ 
    } 

得到索引越界異常的報告說,索引越界爲2我會明白,如果我沒有檢查,看看錯誤[我] [j + 1]不爲空,但我不明白檢查的例外情況?我試着移動!null檢查,但程序在這一行仍然失敗。

任何幫助將不勝感激。

Stack trace: 
Exception in thread "Timer-0" java.lang.ArrayIndexOutOfBoundsException: 2 
at NatComp.data$1.run(data.java:67) 
at java.util.TimerThread.mainLoop(Timer.java:512) 
at java.util.TimerThread.run(Timer.java:462) 
+3

你能發佈完整的堆棧跟蹤嗎?還有一些代碼顯示了你的數組的初始化? –

+1

儘量不要放太多的條件和句子。另外,嘗試以面向對象的方式進行編程,以防止使用if語句。 –

+0

你的循環在哪裏?當'j'處於最後的合法索引處時,使用'j + 1'作爲索引的可能性很大。 –

回答

3

只是檢查state[i][j+1] != null防止NullPointerException,但它不會阻止代碼拋出一個IndexOutOfBoundsException

要檢查IndexOutOfBounds,您需要檢查您的indices對最大允許指數。依靠檢查具有null的元素沒​​有意義。如果索引超出範圍,您將無法訪問元素,因此null檢查可能甚至不是checked

另外,如果你在你的if這麼多的條件下,它能夠更好地在nested它們分開,如果與外if檢查IndexOutOfBounds和內if做實際情況的檢查。這將更具可讀性。

對於例如,如果你有一個數組聲明爲new int[3],然後訪問索引之前,您可以添加一個檢查: -

if (index < 3) { 
    // you can now access `array[index]`, as it is safe now 
    // Also, you can add a check for `NPE` here. 
} 

那是因爲你的索引是從0開始。所以最大可訪問索引是max - 1,其中max是數組的大小。

您可以調整array of array中的相同邏輯。

+0

感謝您的建議。想想我現在可以對它進行排序(希望)。 – Programatt

+1

雖然不使用幻數,但要獲得二維數組的大小,您應該檢查兩個維度。例如。 array.length和陣列[N]。長度 – tysonjh

2

從您的描述中可以清楚地看到j==1當你得到異常。當發生這種情況時,state[i][j+1]會拋出ArrayIndexOutOfBoundsException而不是像您期望的那樣評估爲null

您的代碼不會拋出ArrayIndexOutOfBoundsException的唯一值j爲零,因此您可能需要檢查而不是檢查null

+0

堆棧跟蹤爲: 異常在線程 「定時器-0」 java.lang.ArrayIndexOutOfBoundsException:2 \t在NatComp.data $ 1.run(data.java:67) \t在java.util.TimerThread.mainLoop(Timer.java:512) \t at java.util.TimerThread.run(Timer.java:462) – Programatt

+0

有沒有一種方法可以檢查一個單元格是否存在,然後檢查它是否爲null ? – Programatt