Для цикла для поиска через 2D массив в Java возвращает NullPointerException - PullRequest
0 голосов
/ 31 августа 2018

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

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

Однако проблема, с которой я столкнулся, заключается в том, что если двумерный массив не завершен, как если бы все 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;
}

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

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

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
        }
    }
0 голосов
/ 03 сентября 2018

Как указано в этом сообщении, вы можете использовать equals() или == для сравнения перечислений, но использование == является null безопасным, в то время как 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 голосов
/ 31 августа 2018

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

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

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

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

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

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

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

...