对于在Java中搜索2D数组的循环,返回NullPointerException

问题描述 投票:2回答:3

对于大学的项目,我必须创建一个Tic Tac Toe游戏。

我有for循环与if语句搜索3x3大小的2D数组,并返回,如果它是XO(枚举)。这导致显示哪一方赢得了比赛。

但是,我遇到的问题是,如果2D数组不完整,如果所有9个框都没有填充XO,则该方法显示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;
}
java for-loop arraylist nullpointerexception 2d
3个回答
0
投票

您可以使用多种方法忽略空数组的“null”异常。

第一种方法是用不同的默认符号填充它,例如E.所以当你在开始时初始化你的arry,而不是把它全部为空和null时,你可以用E填充它。

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

添加它开始用E的第一个而不是空值填充它。

另一种方法是找到如何使用try或以下可在此linkhttps://www.javacodegeeks.com/2012/06/avoid-null-pointer-exception-in-java.html中找到的方法忽略空值:

我不会进入它,因为我相信第一种方法更容易使用和实现。但是,根据您对作业的要求,我会同时考虑两者。

希望这有帮助,祝你好运!


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;
}

Enum就像你的实施一样

public enum Symbol{
        X, O
        }
    }

0
投票

正如在this帖子中所述,你可以使用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.
© www.soinside.com 2019 - 2024. All rights reserved.