[英]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.