Java - 初始化数组后和使用类方法测试数组时出现 NullPointerException
Posted
技术标签:
【中文标题】Java - 初始化数组后和使用类方法测试数组时出现 NullPointerException【英文标题】:Java - NullPointerException after initializing array and when testing array with class method 【发布时间】:2014-06-04 19:05:34 【问题描述】:我一直在尝试初始化一个数组,然后用一个类方法测试它的值。我已经初始化了数组并且已经在构造函数中成功地测试了它,所以看起来数组已经被填充了,但是一旦我尝试在 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)
【问题讨论】:
【参考方案1】:boolean[] grid = new boolean[sides];
在这里您创建一个新的boolean
数组网格,它隐藏了类字段。
只是
grid = new boolean[sides];
您将参考网格类字段。
【讨论】:
【参考方案2】:你的问题在于这一行:
boolean[] grid = new boolean[sides];
这是初始化一个局部变量网格,而不是实例中的字段。
改成:
grid = new boolean[sides];
这会初始化实例中的字段。
通过将类型放在前面,您声明了一个新变量。当您在方法中声明变量时,其范围仅限于该方法。由于您的局部变量与您的实例变量命名相同,因此它“隐藏”了实例变量。
【讨论】:
那么当我在前面声明类型时,这是在告诉编译器我要创建一个新变量? @AliumBritt 是的。通过将类型放在前面,您正在声明一个新变量。当您在方法中声明变量时,其范围仅限于该方法。由于您的局部变量与实例变量的名称相同,因此它“隐藏”了实例变量。 好的,我想知道为什么会这样。谢谢你的解释! @AliumBritt 很高兴为您提供帮助 :)【参考方案3】:在构造函数中初始化数组boolean[]
。该数组仅在构造函数中可见。如果你想使用类的数组,那么替换
boolean[] grid = new boolean[sides];
与
grid = new boolean[sides];
。然后你使用类的数组,而不是构造函数的数组。
【讨论】:
【参考方案4】:在构造函数中,您创建了一个与类成员 grid
同名的本地数组,该数组被 local grid
数组遮蔽,这就是空指针的原因异常,因为类成员从未初始化。
简单的改变:
boolean[] grid = new boolean[sides]
到
grid = new boolean[sides]
这将确保您访问所需的班级成员。
【讨论】:
以上是关于Java - 初始化数组后和使用类方法测试数组时出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
java===数组工具类创建,并使用eclipse导出说明文档.html