如何围绕NullPointerException跳舞?

时间:2012-01-15 22:57:27

标签: java nullpointerexception gridworld

我正在尝试使用eclipse和gridworld检查奥赛罗游戏中的移动是否合法。我对该位置做的第一件事是检查它是否有效,但为了检查有效位置,它不需要为空。问题是,它是一个合法行动的要求之一是它是空/空/空闲。我该如何避免这种情况?我已经指出错误应该在哪里。 (对不起,如果这让任何人感到困惑。)

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 个答案:

答案 0 :(得分:3)

一种解决方案是更改您的设计,以便永远不会有null的位置。

您似乎将null等同于“空闲”或“空”。而是首先创建所有位置(在奥赛罗板上没有很多位置)并使用boolean occupied = false或等效成员变量初始化它们。然后你就有了:

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

而不是空检查。

这是更好的面向对象设计,因为空位置仍然是一个位置,应该是可操作的。

答案 1 :(得分:1)

您不应将null用作逻辑的一部分 null它不是一个州,它是符号,没有州
您应该将null从逻辑中移除,如果某个引用是null,您就会知道确实发生了一些非常糟糕的事情,与您的模型无关。在Location内,您可以创建一个方法isEmpty()或类似方法,这样您就可以轻松避免与null进行比较。

答案 2 :(得分:0)

使用值enumBLACKWHITE而不是VACANT的{​​{1}}来存储每个位置的颜色标记。从String类中的enum返回相同的getColor()