有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

初始化数组后和使用类方法测试数组时的Java NullPointerException

我一直在尝试初始化一个数组,然后用类方法测试它的值。我已经初始化了数组,并且已经在构造函数中成功地测试了它,所以看起来数组已经被填充,但是当我尝试在Main方法中测试它时,它就会抛出一个NullPointer异常

class PercolGrid {
    int sides;
    boolean[] grid;

    public PercolGrid (int inSides) {
        sides = inSides;
        //grid = new boolean[] {false,false,false,false,false,
        //false,false,false,false,false};
        boolean[] grid = new boolean[sides];
        for (int i = 0; i < sides; i++) {
            grid[i] = false;
            System.out.println("Setting " + i + " to " + grid[i]);
        }
        System.out.println("Checking outside FOR loop, first square is: " + grid[0]);
    }


    public boolean testSqr (int i) {
        System.out.println("Requested index is: " + i);
        return grid[i];
    }

    public static void main(String[] args){
        PercolGrid firstGrid = new PercolGrid(10);
        System.out.println("Grid created! Checking index ....");
        System.out.println("First square is :" + firstGrid.testSqr(0)); // NullPointerException
        System.out.println("First square is :" + firstGrid.grid[0]); // and here
    }
}

这几乎就像引用的数据存在于构造函数中,但不存在于构造函数之外。当我注释掉for循环和它上面的boolean[] ....行,并取消注释我的grid = new boolean[] ....行时,一切正常,但我想在实例化对象时选择边数

编辑-如果我注释掉第19行(firstGrid.testSqr(0)),而运行第20行(firstGrid.grid[0]),则会发生相同的错误

在我尝试使用2D数组之前,这是一个使用一维数组的练习。我错过了什么

我的输出如下所示:

Setting 0 to false
...
Setting 9 to false
Checking outside FOR loop, first square is: false
Grid created! Checking index ....
Requested index is: 0
java.lang.NullPointerException
    at PercolGrid.testSqr(PercolGrid.java:19)
    at PercolGrid.main(PercolGrid.java:25)

共 (4) 个答案

  1. # 1 楼答案

    您的问题在于这一行:

    boolean[] grid = new boolean[sides];
    

    这是初始化局部变量网格,而不是实例中的字段

    将其更改为:

    grid = new boolean[sides];
    

    这将初始化实例中的字段

    将类型放在前面就是在声明一个新变量。在方法中定义变量时,其范围仅限于该方法。由于局部变量的名称与实例变量相同,因此它“隐藏”了实例变量

  2. # 2 楼答案

    boolean[] grid = new boolean[sides];
    

    这里创建一个新的boolean数组网格,它隐藏了类字段

    只是

    grid = new boolean[sides];
    

    您将参考网格类字段

  3. # 3 楼答案

    在构造函数中,您创建了一个与类成员grid同名的本地数组,该数组被本地grid数组隐藏,这就是导致空指针异常的原因,因为类成员从未初始化

    简单更改:

     boolean[] grid = new boolean[sides]
    

     grid = new boolean[sides]
    

    这将确保您访问所需的类成员

  4. # 4 楼答案

    在构造函数中初始化数组boolean[]。数组仅在构造函数中可见。如果要使用类的数组,请替换

    boolean[] grid = new boolean[sides];
    

    grid = new boolean[sides];
    

    。然后使用类的数组,而不是构造函数的数组