我一直在尝试初始化一个数组,然后用类方法测试它的值。我已经初始化了数组,并且已经在构造函数中成功测试了它,所以它看起来像是填充了数组,但是当我尝试在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)
答案 0 :(得分:4)
你的问题在于这一行:
boolean[] grid = new boolean[sides];
这是初始化局部变量网格,而不是实例中的字段。
将其更改为:
grid = new boolean[sides];
这会初始化实例中的字段。
通过将类型放在前面,您将声明一个新变量。当您在方法中声明变量时,其范围仅限于该方法。由于您的局部变量的名称与实例变量相同,因此它“隐藏”了实例变量。
答案 1 :(得分:3)
boolean[] grid = new boolean[sides];
在这里,您可以创建一个隐藏类字段的新boolean
数组网格。
只需
grid = new boolean[sides];
您将参考网格类字段。
答案 2 :(得分:1)
在构造函数中初始化数组boolean[]
。该数组仅在构造函数中可见。如果要使用该类的数组,请替换
boolean[] grid = new boolean[sides];
与
grid = new boolean[sides];
。然后使用类的数组,而不是构造函数的数组。
答案 3 :(得分:1)
在构造函数中,您创建了一个与类成员grid
同名的本地数组,该数组被本地 grid
数组遮蔽,这就是原因对于空指针异常,因为类成员从未初始化。
简单地改变:
boolean[] grid = new boolean[sides]
到
grid = new boolean[sides]
这将确保您访问所需的班级成员。