2016-05-07 11 views
1

私は8個のクイーンズの問題を抱えており、クイーンズ間に衝突があるかどうかをチェックするメソッドを実装しようとしています。問題の論理については、理解していると思いますが、NullpointerExceptionが発生しています。理由を理解できません。どんな助けも高く評価されます。Java配列のNullPointerException - 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(matrix[i][j] == 1){ 
    queens[i] = new Queen(i, j); 
} 

したがって、1つのスポット場合:あなたはqueens[]にすべての場所でのクイーンを置いていなかったよう

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

「ドット」操作の1つが「ヌル」を戻しています。このため、複雑な式の部分をローカル変数に割り当てることが必要な場合があります。これにより、例外が発生した場所をより正確に特定できます。 –

+1

デバッガを使用します。 – mre

答えて

0

これが聞こえますqueens[]がここで設定されていない場合、null、したがってqueens[j].getX()またはqueens[j].getY()がNPEを生成します。そのため、この操作を行う前に、このarrayが正しく記入されているかどうかを確認してください(forsの間で行います)。

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を追加する必要があります:ダブルfor loop

1

はそのようなcontinueを使用してスキップしない場合は、両方の王妃が設定されているかどうかを確認するテストを追加しますメインループと次のようにあなたの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を中断します。 同じことをする別の方法は、trueisInCollisionに影響を与える代わりにreturn true;を実行してから、ループの後の値を返すことです。

関連する問題