Java - 初始化数组后以及使用类方法测试数组时出现 NullPointerException

标签 java arrays methods 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 数组进行相同操作之前使用 1D 数组的练习。我错过了什么?

我的输出如下所示:

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)

最佳答案

您的问题出在这一行:

boolean[] grid = new boolean[sides];

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

将其更改为:

grid = new boolean[sides];

这会初始化实例中的字段。

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

关于Java - 初始化数组后以及使用类方法测试数组时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37091827/

相关文章:

c# - 使用方法作为变量

java - MongoDB 连接问题

java - random.nextInt(12*4+2) 的含义

c++ - 为什么std::random_device类成员导致段错误?

c# - 使列表中的按钮将唯一数据发送到方法

methods - 如何通过函数指针调用方法?

java - 使用 Beam SQL 查询 Avro 架构

java - 使用 arraylist 读取和写入文本文件

python - Numpy 在另一个数组中查找元素索引

javascript - 遍历 FileList 声明