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实验项目二——二维数组实现九九乘法表

java 类型类怎么初始化赋值

java===数组工具类创建,并使用eclipse导出说明文档.html

java中数组变量名的默认值 如定义int[] a;此时a的默认值应该为null吧,如

数组String

java Object和byte数组互相转换中遇到的问题