对于大学的项目,我必须创建一个Tic Tac Toe游戏。
我有for
循环与if
语句搜索3x3大小的2D数组,并返回,如果它是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;
}
您可以使用多种方法忽略空数组的“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中找到的方法忽略空值:
我不会进入它,因为我相信第一种方法更容易使用和实现。但是,根据您对作业的要求,我会同时考虑两者。
希望这有帮助,祝你好运!
您可以更改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
}
}
正如在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.