For循环在Java中搜索2D数组将返回NullPointerException

时间:2018-08-31 20:18:04

标签: java for-loop arraylist nullpointerexception 2d

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

我有这个for循环和if语句来搜索3x3大小的2D数组,并返回是X还是O(枚举)。这样可以显示出哪一方赢得了比赛。

但是,我遇到的问题是,如果2D数组不完整,例如9个框都没有用XO填充,则该方法将显示{{1} }。

编辑:我必须补充一点,我要求空白网格为NullPointerException,因为很少有其他单元测试假定null初始化为grid[][]。 / p>

错误:

null

代码:

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

3 个答案:

答案 0 :(得分:0)

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

第一种方法是用其他默认符号(例如E)填充它。因此,当您在开始时初始化arry时,可以将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中找到的以下方法来忽略空值:

因为我相信第一种方法更易于使用和实现,所以我不打算讨论它。但是,根据您对任务的要求,我会同时检查两者以确保。

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

答案 1 :(得分: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
        }
    }

答案 2 :(得分:0)

this中所述,您可以使用equals()==来比较枚举,但使用==是安全的,而{{1} }不是。

所以基本上,只需像这样写支票即可:

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