簡體   English   中英

Java - 初始化數組后和使用類方法測試數組時的 NullPointerException

[英]Java - NullPointerException after initializing array and when testing array with class method

我一直在嘗試初始化一個數組,然后用一個類方法測試它的值。 我已經初始化了數組並且已經在構造函數中成功地測試了它,所以它看起來像填充了數組,但是一旦我嘗試在 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];

這將初始化實例中的字段。

通過將類型放在前面,您可以聲明一個新變量。 當您在方法中聲明變量時,其范圍僅限於該方法。 由於您的局部變量與您的實例變量命名相同,因此它“隱藏”了實例變量。

boolean[] grid = new boolean[sides];

在這里,您創建了一個隱藏類字段的新boolean組網格。

只是

grid = new boolean[sides];

您將參考網格類字段。

在構造函數中,您初始化一個數組boolean[] 該數組僅在構造函數中可見。 如果要使用類的數組,則替換

boolean[] grid = new boolean[sides];

grid = new boolean[sides];

. 然后你使用類的數組,而不是構造函數的數組。

在構造函數中,您創建了一個與類成員grid同名的本地數組,該數組被本地grid數組遮蔽,這就是空指針異常的原因,因為類成員從未初始化。

只需更改:

 boolean[] grid = new boolean[sides]

 grid = new boolean[sides]

這將確保您訪問所需的類成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM