我一直在尝试初始化一个数组,然后使用类方法测试它的值。我已经初始化了数组,并且已经在构造函数中成功测试了它,因此看起来数组已填充,但是当我尝试在 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/