Как танцевать вокруг исключения NullPointerException?

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

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

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

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

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

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

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

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

Другие вопросы по тегам