2016-05-07 22 views
1

我正在做8皇后問題,並試圖實現將檢查皇后之間是否有任何碰撞的方法。說到問題的邏輯,我想我明白了,但是我得到了NullpointerException,我無法弄清楚原因。任何幫助將不勝感激。NullPointerException與Java數組 - 8個皇后

private static boolean isOK(int[][] matrix) { 
     boolean isInCollision = false; 
     Queen [] queens = new Queen[8]; 
     for (int i = 0; i < matrix.length; i++) { 
      for (int j = 0; j < matrix.length; j++) { 
       if(matrix[i][j] == 1){ 
        queens[i] = new Queen(i, j); 

       } 
      } 
     } 


     for (int i = 0; i < queens.length; i++) { 
      for (int j = i+1; j < queens.length; j++) { 
       if(queens[i].getX()==queens[j].getX() && Math.abs(queens[i].getX()-queens[j].getX())==Math.abs(queens[i].getY()-queens[j].getY())){ 
        isInCollision = true; 
       } 
      } 
     } 
     return isInCollision; 
    } 

我得到錯誤在這行代碼:

if(queens[i].getX()==queens[j].getX() && Math.abs(queens[i].getX()-queens[j].getX())==Math.abs(queens[i].getY()-queens[j].getY())) 
+0

其中一個「點」操作返回null。這就是爲什麼你可能想將複雜表達式的一部分分配給局部變量的原因。這將允許您更好地識別發生異常的位置。 –

+1

使用調試器。 – mre

回答

0

這聽起來像是你不把皇后的所有地方queens[]

if(matrix[i][j] == 1){ 
    queens[i] = new Queen(i, j); 
} 

因此,如果一個地方在queens[]這裏沒有設置,它會是null因此queens[j].getX()或者queens[j].getY()會產生NPE。因此,在對它進行任何操作之前檢查這個array是否正確填充(在fors之間執行)。

1

在雙for loop添加一個測試來檢查,如果兩個皇后都設置如果不能跳過使用continue這樣的:

for (int i = 0; i < queens.length; i++) { 
    for (int j = i+1; j < queens.length; j++) { 
     if (queens[i] == null || queens[j] == null) { 
      continue; 
     } 
     // rest of the method here 
    } 
} 

你也應該一次碰撞已經被賦予一個標籤,檢測加break主迴路,並使用這個標籤與break爲下一個:

main: for (int i = 0; i < queens.length; i++) { 
    for (int j = i+1; j < queens.length; j++) { 
     // previous test here 
     if (collision detected) { 
      isInCollision = true; 
      break main; 
     } 
    } 
} 

這會盡快衝突已檢測到的裂口雙for loop。 做同樣的事情的另一種方法是簡單地做return true;而不是影響trueisInCollision,然後返回循環後的值。