2017-09-05 98 views
-1

我正在通過Codefights網站致力於Java。這是練習:Java數組錯誤(不超出範圍)

成名後,CodeBots決定搬到一棟新的建築並共同生活。該建築物由一個矩形的 房間表示,每個單元格包含一個整數 - 房間的價格。一些 房間是免費的(他們的成本爲0),但這可能是因爲他們是鬼鬼祟祟的 ,所以所有的機器人都害怕他們。這就是爲什麼任何房間 是免費的或位於同一列的免費房間下方的任何地方是 不適合機器人。幫助機器人計算適合他們的所有房間的總價格。例如: 對於

matrix = [[0, 1, 1, 2], 
      [0, 5, 0, 0], 
      [2, 0, 3, 3]] 

輸出應爲matrixElementsSum(matrix) = 9。這裏的客房,標有 'X' 不適合房間的矩陣:

[[x, 1, 1, 2], 
[x, 5, x, x], 
[x, x, x, x]] 

因此,答案是1 + 5 + 1 + 2 = 9

我明白,我得走了通過數組的所有元素,這很容易。我掛斷的部分是檢查數組中當前元素上方的「0」個房間。我知道那個位置將是矩陣[i-1] [j],其中陣列中的當前位置是矩陣[i] [j]。但是,當我嘗試執行此操作時,出現「InvocationTargetExeption」錯誤。

我的假設是,我要求在數組地址負數,但我不知道如何解決這個問題。這裏是我的代碼:

int matrixElementsSum(int[][] matrix) { 
    int sum = 0; 
    for(int i = 0; i < matrix.length; i++){ 
     for(int j = 0; j < matrix[i].length; j++){ 
      if(matrix[i-1][j]==0){ sum += 0;} 
      else{sum += matrix[i][j];} 
       } 
     } 
    return sum; 
} 
+2

這可能仍然是一個AIOOBE。您需要檢查堆棧跟蹤的其餘部分(並在此處發佈)。 –

+1

你有我從0開始,你在if語句中使用i-1,所以當我= 0時,你正在調用矩陣[-1] – Tyler

+0

隨着i == 0你嘗試訪問矩陣[-1]在if語句中導致異常。你如何調用這段代碼?看起來這裏有一些框架。這個異常應該繼續「引起」,並且早於應該有一個ArrayIndexOutOfBoundsException或類似的東西 – Lothar

回答

0

ArrayIndexOutOfBoundsException,你可以通過更換修復:

if(matrix[i-1][j]==0){ sum += 0;} 

有:

if(i > 0 && matrix[i-1][j]==0){ sum += 0;} 

你得到它,因爲你試圖訪問:matrix[i-1][j],當i = 0時,則i-1 = -1 ...

按照預期在您提供的示例中運行矩陣中的固定代碼返回9。

我能想到的唯一理由,那你看到的InvocationTargetException是,如果你使用反射調用matrixElementsSum:則拋出一個ArrayIndexOutOfBoundsException這是由InvocationTargetException包裹。

Method.java文檔字符串:

* @exception InvocationTargetException if the underlying method 
*    throws an exception. 
+0

哦,真好!和聲明意味着如果我是否定的,如果地址是負數,矩陣甚至不會被引用,所以沒有例外。我很感激這個幫助,但是現在我們要做什麼,我們還必須評估上面的房間。這意味着如果我僅僅是1,那麼就會拋出同樣的例外,因爲1 - 2仍然是負數。 –

+0

我在想另一個if語句,使用i> 1和[i-2]嵌套在第一個if? –

+1

我再次感謝您的幫助。第二條if語句奏效。 Codefights的一個詭辯是,除非你解決問題,否則你不能看到任何解決方案。我認爲這是一個邏輯,但有時候我想知道,在繼續之前,卡住是否比查看好的答案和消化它的效率低。另一方面,有時您從事研究的做法可能與練習編碼一樣有價值。謝謝,所有! O7 –