Для цикла для поиска в 2D массиве в Java возвращается NullPointerException

2

Для проекта в университете мне нужно создать игру Tic Tac Toe.

У меня есть это for цикла с операторами if для поиска по 2D-массиву размером 3x3 и возврата, если это либо X либо O (перечисление). Это приводит к тому, чтобы показать, какая сторона выиграла игру.

Однако проблема заключается в том, что если 2D-массив не является полным, как и в случае, если все 9 ящиков не заполнены X или O, метод показывает NullPointerException.

Изменить: мне нужно добавить, что я требую, чтобы пустая сетка была null поскольку несколько других модульных тестов предполагают, что grid[][] инициализируется как null.

Ошибка:

Exception in thread "main" java.lang.NullPointerException
at TicTacToeImplementation.whoHasWon(TicTacToeImplementation.java:80)
at ApplicationRunner.main(ApplicationRunner.java:24)

Код:

public enum Symbol {
    X, O
}

private Symbol winner;

public Symbol whoHasWon() {

    for (Symbol xORo : Symbol.values()) {

        if ((grid[0][0].equals(xORo) &&
                grid[0][1].equals(xORo) &&
                grid[0][2].equals(xORo))) {
            winner = xORo;
            isGameOver = true;

            break;
        } else if ((grid[1][0].equals(xORo) &&
                grid[1][1].equals(xORo) &&
                grid[1][2].equals(xORo))) {
            winner = xORo;
            isGameOver = true;

            break;}
           else if { //Code carries on to account for all 8 different ways of winning

        } else {

            isGameOver = true;
        }
    }

    return winner;
}
  • 0
    Возможная копия Что такое NullPointerException, и как я могу это исправить?
  • 1
    Где инициализируется grid ? Но, поскольку значения enum можно (и нужно) сравнивать с помощью == , измените код на grid[0][0] == xORo , поэтому пустая (иначе null ) ячейка будет сравнивать false вместо броска NPE.
Показать ещё 1 комментарий
Теги:
arraylist
for-loop
nullpointerexception
2d

3 ответа

0

Как указано в этом сообщении, вы можете использовать либо equals() либо == для сравнения перечислений, но использование == является null safe, а equals() - нет.

Итак, в основном, просто напишите свои чеки следующим образом:

if (grid[0][0] == xORo &&
    grid[0][1] == xORo &&
    // etc.

Однако, если вы хотите использовать метод equals(), вы можете просто написать метод, который проверяет значение null затем сравнивает два значения и возвращает результат:

public boolean isEqual(Symbol s1, Symbol s2) {
    if (s1 != null && s1.equals(s2)) {
        return true;
    }
    return false;
}

Затем вы можете вызвать метод isEqual() следующим образом:

if (isEqual(grid[0][0], xORo) &&
    isEqual(grid[0][1], xORo) &&
    // etc.
0

Вы можете использовать несколько способов игнорировать исключение "null" с пустым массивом.

Первый способ - заполнить его другим символом по умолчанию, таким как E. Итак, когда вы инициализируете свой arry в начале, вместо того чтобы сделать его пустым и пустым, вы можете заполнить его E

for(int i=0;i<=2;i++){
    for(int k=0;k<=2;k++){
        grid[i][k] = "E";
    }
}

Добавьте это, чтобы сначала заполнить его первым, а не нулями.

Другой метод - найти, как игнорировать нули, используя try или следующие методы, которые можно найти в этой ссылке https://www.javacodegeeks.com/2012/06/avoid-null-pointer-exception-in-java.html:

Я не буду вдаваться в него, потому что считаю, что 1-й метод проще в использовании и реализации. Однако, в зависимости от ваших требований к вашему заданию, я бы посмотрел на оба, чтобы быть уверенным.

Надеюсь это поможет. Удачи!

  • 0
    Я должен сохранять нулевое значение, так как у меня также есть некоторое модульное тестирование, которое требует, чтобы начальные значения были нулевыми. Я посмотрю на второй, чтобы избежать исключения нулевой точки. Кроме того, это только моя 3-я неделя изучения Java с самого начала, поэтому мне, вероятно, понадобится немного больше направления
  • 0
    ха, только моя 2-я неделя изучения Java ... но в любом случае я хотел бы проверить, что веб-сайт, на который я ссылался, или просто искать "игнорировать исключение нулевого указателя в Java" в Google
0

Вы можете изменить сравнение String. Код может быть таким:

public Symbol whoHasWon() {

    for (Symbol xORo : Symbol.values()) {

        if ((grid[0][0] == xORo.name() &&
                grid[0][1] == xORo.name() &&
                grid[0][2] == xORo.name())) {
            winner = xORo;
            isGameOver = true;

            break;
        } else if ((grid[1][0] == xORo.name() &&
                grid[1][1] == xORo.name() &&
                grid[1][2] == xORo.name())) {
            winner = xORo;
            isGameOver = true;

            break;}
        else if { //Code carries on to account for all 8 different ways of winning

        } else {

            isGameOver = true;
        }
    }

    return winner;
}

Перечислите, как вы реализовали

public enum Symbol{
        X, O
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню