我正在尝试为我的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的声明。
请尽快回答我的问题,我似乎无法弄明白。
答案 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();
}