【问题标题】:NullPointerException with Java array - 8 queens [duplicate]带有Java数组的NullPointerException - 8个皇后[重复]
【发布时间】:2016-05-07 11:51:02
【问题描述】:

我正在做 8 个皇后问题,并尝试实现检查皇后之间是否有任何碰撞的方法。当谈到问题的逻辑时,我想我理解它,但是我得到 NullpointerException 并且我不知道为什么。任何帮助将不胜感激。

private static boolean isOK(int[][] matrix) {
        boolean isInCollision = false;
        Queen [] queens = new Queen[8];
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                if(matrix[i][j] == 1){
                    queens[i] = new Queen(i, j);

                }
            }
        }


        for (int i = 0; i < queens.length; i++) {
            for (int j = i+1; j < queens.length; j++) {
                if(queens[i].getX()==queens[j].getX() && Math.abs(queens[i].getX()-queens[j].getX())==Math.abs(queens[i].getY()-queens[j].getY())){
                    isInCollision = true;
                }
            }
        }
        return isInCollision;
    }

我在这行代码中遇到错误:

if(queens[i].getX()==queens[j].getX() && Math.abs(queens[i].getX()-queens[j].getX())==Math.abs(queens[i].getY()-queens[j].getY()))

【问题讨论】:

  • 其中一个“点”操作返回null。这就是您可能希望将复杂表达式的一部分分配给局部变量的原因。这将使您能够更好地确定异常发生的位置。

标签: java arrays nullpointerexception


【解决方案1】:

在双 for loop 中添加一个测试,如果不使用 continue 这样跳过,则检查是否设置了两个皇后:

 for (int i = 0; i < queens.length; i++) {
    for (int j = i+1; j < queens.length; j++) {
        if (queens[i] == null || queens[j] == null) {
            continue;
        }
        // rest of the method here
    }
}

一旦检测到碰撞,您还应该添加一个break,方法是为主循环提供一个标签,然后将此标签与您的break 一起使用:

main: for (int i = 0; i < queens.length; i++) {
    for (int j = i+1; j < queens.length; j++) {
        // previous test here
        if (collision detected) {
            isInCollision = true;
            break main;
        }
    }
}

一旦检测到冲突,这将打破双重for loop。 另一种方法是简单地执行return true;,而不是将true 影响到isInCollision,然后在循环之后返回值。

【讨论】:

    【解决方案2】:

    听起来你没有在queens[]的所有地方都放置皇后:

    if(matrix[i][j] == 1){
         queens[i] = new Queen(i, j);
    }
    

    因此,如果此处未设置queens[] 中的一个点,则它将为null,因此queens[j].getX() 或queens[j].getY() 将产生NPE。所以,在对它进行任何操作之前检查这个array是否被正确填充(在fors之间做)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2016-07-11
      相关资源
      最近更新 更多