【问题标题】:For loop to search through 2D array in Java returns NullPointerExceptionFor循环在Java中搜索二维数组返回NullPointerException
【发布时间】:2019-02-06 21:07:51
【问题描述】:

对于大学的一个项目,我必须创建一个井字游戏。

我有这个带有if 语句的for 循环来搜索3x3 大小的二维数组,如果它是XO(枚举)则返回。这会显示哪一方赢得了比赛。

但是,我遇到的问题是,如果二维数组不完整,例如所有 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;
}

【问题讨论】:

  • grid 在哪里初始化?但是,由于可以(并且应该)使用== 比较枚举值,请将代码更改为grid[0][0] == xORo,因此空白(又名null)单元格将比较为假,而不是抛出 NPE。
  • 您可以在equals方法之前检查是否为null。其他方法是用任何其他字符逗号点 exc 填充所有行。

标签: java for-loop arraylist nullpointerexception 2d


【解决方案1】:

正如this 帖子中所述,您可以使用equals()== 来比较枚举,但使用== 是安全的nullequals() 不是。

所以基本上,只要这样写你的支票:

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.

【讨论】:

    【解决方案2】:

    你可以更改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
            }
        }
    

    【讨论】:

      【解决方案3】:

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

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

      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 找到如何忽略空值:

      我不会深入讨论,因为我相信第一种方法更易于使用和实施。但是,根据您对任务的要求,我会同时查看两者以确定。

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

      【讨论】:

      • 我需要保留 null,因为我还有一些单元测试需要初始值为 null。我将看看第二个以避免空点异常。另外,这只是我从头开始学习 Java 的第三周,所以我可能需要更多的指导
      • 哈哈,这只是我学习 java 的第二周......但无论如何我会查看我链接的那个网站,或者只是在谷歌中搜索“忽略 java 中的空指针异常”
      猜你喜欢
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多