2014-04-27 77 views
-3

我正在嘗試爲我的Java類製作遊戲,但我一直在獲取NPE。我知道這意味着其中一個變量被傳遞爲null,但我不知道在哪裏。我已經檢查了所有涉及的變量。我相信這可能是一個初始化數組的問題,但我仍然沒有看到我做錯了什麼。我已經檢查過堆棧溢出,並且由於各種原因已經看到NPE,但是我找不到適用於我的解決方案。當通過數組傳遞布爾值時發生java.lang.NullPointerException

public class Inventory{ 
public int gold = 0; 
private Item[] itemListArray = new Item[30]; 
private JButton[] itemButtonArray = new JButton[30]; 
private JButton buttonBack = new JButton("Back"); 
private static final String HOME = "Home"; 
public Inventory() { 
    for(int i = 1;i < 31; i++) 
    { 
     itemListArray[i].emptySlot = true; //Here is where the NPE hits 
    } 
}} 

也就是說在NPE呼籲錯誤

public class Item { 
protected String name = ""; 
protected int def = 0; 
protected int stack = 100; 
protected boolean stackable = false; 
protected boolean consume = false; 
boolean emptySlot = true; 
protected ImageIcon icon; 
public Item(){ 

} 
public boolean isArmor() 
{ 
    if(def >= 1) 
    { 
    return true; 
    } else { 
    return false; 
    } 
} 
public boolean isConsumable() 
{ 
    if(consume = true) 
    { 
     return true; 
    } else { 
     return false; 
    } 
} 
public boolean isEmpty() 
{ 
    if(emptySlot = true) 
    { 
     return true; 
    } else { 
     return false; 
    } 
} 

這裏是項目的申報。

請回答我的問題,我似乎無法弄清楚。

+1

NPE的確有一個原因*。你試圖使用的是'null' –

+0

可能重複的[Java數組,NullPointerException?](http://stackoverflow.com/questions/15170192/java-array-nullpointerexception)或任何其他100次這個已被問到。 –

回答

1

僅僅實例化數組是不夠的,您還必須使用對象填充它。否則,每個索引默認包含null。

private Item[] itemListArray = new Item[30]; 
for (int i = 0; i < itemListArray.length; i++) { 
    itemListArray[i] = new Item(); 
} 
1

您使用private Item[] itemListArray = new Item[30];實例化您的數組,其中創建一個包含30個空條目的Item類型的數組。

當您在構造函數的循環中調用itemListArray[i].emptySlot時,您正在從空對象訪問變量。

在訪問任何變量或調用任何方法之前,必須在構造函數(或其他地方)的循環中實例化數組中的任何Item對象。

另外您的for循環正在跳過第一個元素。 Java中的第一個元素的索引爲0.

2

此代碼只是創建一個包含null值的數組,你需要初始化數組中的每個單獨的值。

for(int i = 1;i < 31; i++) 
{ 
    itemListArray[i].emptySlot = true; //Here is where the NPE hits 
} 

而這個週期會因爲在Java有效的數組索引後引起ArrayIndexOutOfBoundsException從0開始,去array.length-1(0至29日在你的情況下),而該代碼會試圖訪問itemListArray[ 30 ]

0

我猜你可能並不瞭解java.you中的初始化只是初始化一個數組,但它並沒有引用真實的對象。

這樣的代碼將有助於:

for(int i = 1;i < 31; i++){ 
     Item item = new Item(); 
     item.emptySlot = true; 
     itemListArray[i] = item; //Here is where the NPE hits 
} 

嘗試使用項目類的構造函數要好得多,希望它的工作。

0

創建一個對象數組默認將它們全部設爲null。您需要將一個對象放入數組的每個元素中以消除此問題。

for (int i = 0; i < itemListArray.length; i++) { 
    itemListArray[i] = new Item(); 
} 

for (int j = 0; j < itemButtonArray.length; j++) { 
    itemButtonArray[j] = new JButton(); 
}