【问题标题】:Java - NullPointerException after initializing array and when testing array with class methodJava - 初始化数组后和使用类方法测试数组时出现 NullPointerException
【发布时间】: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)

【问题讨论】:

    标签: java arrays methods nullpointerexception


    【解决方案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]
        

        这将确保您访问所需的班级成员。

        【讨论】:

          猜你喜欢
          • 2013-09-12
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          • 2017-08-02
          • 1970-01-01
          • 1970-01-01
          • 2020-07-12
          相关资源
          最近更新 更多