2012-01-15 34 views
0

私は、eclipseとgridworldを使って、ゲームのオセロで動きが合法であるかどうかをチェックしようとしています。私がその場所に行う最初のことは、それが有効であるかどうかをチェックすることですが、有効性の場所を確認するためにはnullにする必要はありません。問題は、それが法的な動きであるという要件の1つは、それがヌル/空/非占有であるということです。これを避けるにはどうすればいいですか?私はエラーがどこにあるのかを指摘しました。 (これは誰を混同している場合申し訳ありません。)NullPointerExceptionを回避する方法は?

public boolean isLegal(Location loc1) 
{ 
    boolean isLegal = false; 
    String currentColor = currentPlayer.getColor(); 
    int row = loc1.getRow(); 
    int col = loc1.getCol(); 
    if(board.isValid(loc1)) 
    { 
     if(board.get(loc1) == null) 
     { 
      for(Location tempLoc : board.getValidAdjacentLocations(loc1)) 
      { 
       **if(!board.get(tempLoc).equals(currentColor))** 
       { 
        if((row != tempLoc.getRow()) && (col == tempLoc.getCol())) 
        { 
         //count up column 
         if(tempLoc.getRow() < row) 
         { 
          for(int i = row; i > 1;) 
          { 
           Location tempLoc2 = new Location(i-2, col); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i--; 
           } 
           else 
           { 
            i=-1; 
            isLegal = true; 
           } 
          } 
         } 
         //count down column 
         else 
         { 
          for(int i = row; i < 6;) 
          { 
           Location tempLoc2 = new Location(i+2, col); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i++; 
           } 
           else 
           { 
            i=9; 
            isLegal = true; 
           } 
          } 
         } 
        } 
        else if(col != tempLoc.getCol() && row == tempLoc.getRow()) 
        { 
         //count right row 
         if(col > tempLoc.getCol()) 
         { 
          for(int i = col; i > 1;) 
          { 
           Location tempLoc2 = new Location(row, i-2); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i--; 
           } 
           else 
           { 
            i=-1; 
            isLegal = true; 
           } 
          } 
         } 
         //count left row 
         else 
         { 
          for(int i = col; i < 6;) 
          { 
           Location tempLoc2 = new Location(row, i+2); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i++; 
           } 
           else 
           { 
            i=9; 
            isLegal = true; 
           } 
          } 
         } 
        } 
        else 
        { //count up/right diag 
         if(row-1 == tempLoc.getRow() && col+1 == tempLoc.getCol()) 
         { 
          int j = col; 
          for(int i = row; i > 1;) 
          { 
           Location tempLoc2 = new Location(i-1, j+1); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i--; 
            j++; 
           } 
           else 
           { 
            i=-1; 
            isLegal = true; 
           } 
          } 
         } 
         //count down/left diag 
         else if(row+1 == tempLoc.getRow() && col-1 == tempLoc.getCol()) 
         { 
          int i = row; 
          for(int j = col; j > 1;) 
          { 
           Location tempLoc2 = new Location(i+1, j-1); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i++; 
            j--; 
           } 
           else 
           { 
            i=9; 
            isLegal = true; 
           } 
          } 
         } 
         //count up/left diag 
         else if(row-1 == tempLoc.getRow() && col-1 == tempLoc.getCol()) 
         { 
          int j = col; 
          for(int i = row; i > 1;) 
          { 
           Location tempLoc2 = new Location(i-1, j-1); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i--; 
            j--; 
           } 
           else 
           { 
            i=-1; 
            isLegal = true; 
           } 
          } 
         } 
         //count down/right diag 
         else 
         { 
          int j = col; 
          for(int i = row; i > 6;) 
          { 
           Location tempLoc2 = new Location(i+1, j+1); 
           if(!board.get(tempLoc2).equals(currentColor)) 
           { 
            i++; 
            j++; 
           } 
           else 
           { 
            i=-1; 
            isLegal = true; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    return isLegal; 
} 
+3

'if(ref == null)'で参照がnullかどうかをテストできます... –

+0

私はそれを行いました。問題は、このnullの場所で作業する必要がありますが、nullの場合はできません。それが私の問題です。私は同じことを達成するためにNullPointerExceptionを持たない代替コードを見つけようとしています。 – frozenxdreamer

+0

参照がnullであることを確認したら、それを介してメンバーメソッドを呼び出さないでください。 –

答えて

3

一つの解決策は何の場所が今までnullしないように、あなたのデザインを変更することです。

nullは「空」または「空」とみなされているようです。代わりにすべてのポジションを最初に作成してください(オセロボードには多くのポジションはありません)。boolean occupied = falseまたは同等のメンバー変数ですべてのポジションを初期化してください。それから、あなたはヌルチェックではなく

if (!board.get(loc1).isOccupied()) { /*stuff*/ } 

の代わりになります。

これは空の場所がまだ場所であり、操作可能であるため、オブジェクト指向のデザインが優れています。

+0

ありがとう!私は今休憩を取るつもりですが、私はこれを試して非常に興奮しています! – frozenxdreamer

+0

私はもう少し行きます。私はBoardクラスでLocationsのセットを残したいと思いますが、Coordinatesクラスも作成します。 LocationにはCoordinatesがあり、board.get(座標)を使用すると、isOccupied()などのメソッドpaisleeを持つLocationを返すことができます。メソッドに渡す場所を取得する場所は、私にとっては奇妙なようです。また、私があなたであれば、このコードをリファクタリングします。 –

+0

これは良い考えのようです。私もそれを試してみるでしょう。洞察力ありがとう! – frozenxdreamer

1

ロジックの一部としてnullを使用しないでください。
nullこれは状態ではありません、の状態であることを示す記号です。
nullをロジックの外に残す必要があります。参照番号がnullの場合は、モデルに関係なく実際に何かが起こっているかどうかを確認する必要があります。 Locationの中には、たとえばisEmpty()などのメソッドを作成することができますので、nullと簡単に比較することはできません。

0

使用する値の代わりにStringBLACKWHITEVACANTenumは、各位置にある何色トークン格納します。 PlayerクラスのgetColor()から同じenumを返します。

関連する問題