通过数组传递布尔值时的java.lang.NullPointerException

时间:2014-04-27 05:27:34

标签: java arrays boolean

我正在尝试为我的Java课程制作游戏,但我一直在获得NPE。我知道这意味着传递的变量之一是null,但我不知道在哪里。我检查了所有涉及的变量。我认为这可能是初始化阵列的一个问题,但我仍然没有看到我做错了什么。我已经检查了堆栈溢出并且由于各种原因我看到了NPE,但我找不到适用于我的解决方案。

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;
    }
}

这是Item的声明。

请尽快回答我的问题,我似乎无法弄明白。

5 个答案:

答案 0 :(得分:2)

Item[] itemListArray = new Item[30];

此代码只创建一个包含null值的数组,您需要初始化数组中的每个值。

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

此循环稍后将导致ArrayIndexOutOfBoundsException,因为在Java中,有效数组索引从0开始并转到array.length-1(在您的情况下为0到29),而此代码将尝试访问{{1 }}

答案 1 :(得分:1)

使用private Item[] itemListArray = new Item[30];实例化数组,创建一个包含30个空条目的Item类型的数组。

当您在构造函数中调用循环中的itemListArray[i].emptySlot时,您正在从null对象访问变量。

在您可以访问任何变量或从中调用任何方法之前,您必须在构造函数(或其他地方)的循环中实例化数组中的任何Item对象。

此外,您的for循环正在跳过第一个元素。 Java中的第一个元素的索引为0。

答案 2 :(得分:1)

实例化数组不够,还必须用对象填充它。否则,每个索引默认包含null。

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

答案 3 :(得分:0)

我猜你可能还没有理解java中的初始化。你只是初始化一个数组,但它没有引用真实对象。

像这样的代码会有所帮助:

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

尝试在Item类中使用构造函数要好得多,希望它能正常工作。

答案 4 :(得分: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();
}