Как танцевать вокруг NullPointerException? - PullRequest
0 голосов
/ 16 января 2012

Я пытаюсь проверить, является ли ход легальным в игре Отелло, используя 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 ]

3 голосов
/ 16 января 2012

Одним из решений является изменение вашего дизайна так, чтобы нигде не было места null.

Вы, похоже, приравняли null к "незанятым" или "пустым". Вместо этого сначала создайте все позиции (их не так много на доске Отелло) и инициализируйте их все с помощью boolean occupied = false или эквивалентной переменной-члена. Тогда у вас будет:

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

вместо нулевой проверки.

Это лучший объектно-ориентированный дизайн, потому что пустое местоположение все еще является местоположением, и им следует манипулировать.

1 голос
/ 16 января 2012

Вы не должны использовать null как часть своей логики.
null это не состояние, это символ , что нет состояния .
Вы должныоставьте null вне вашей логики, тогда, если какая-то ссылка будет null, вы знаете, что наверняка случится что-то действительно неприятное, не связанное с вашей моделью.Внутри Location вы можете создать, например, метод isEmpty() или аналогичный, чтобы вы могли легко избежать сравнения с null.

0 голосов
/ 16 января 2012

Используйте enum со значениями BLACK, WHITE и VACANT вместо String для хранения маркера какого цвета в каждом месте.Верните те же enum из getColor() в классе Player.

...