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

通过数组传递布尔值时的java.lang.NullPointerException,java,arrays,boolean,Java,Arrays,Boolean,我试图为我的Java类制作一个游戏,但我一直得到一个NPE。我知道这意味着传递的一个变量是空的,但我不知道在哪里。我已经检查了所有涉及的变量。我相信初始化数组可能有问题,但我仍然不知道我做错了什么。我已经检查了堆栈溢出,我看到了由于各种原因导致的NPE,但我找不到一个适合我的解决方案 public class Inventory{ public int gold = 0; private Item[] itemListArray = new Item[30]; private JButton[]

我试图为我的Java类制作一个游戏,但我一直得到一个NPE。我知道这意味着传递的一个变量是空的,但我不知道在哪里。我已经检查了所有涉及的变量。我相信初始化数组可能有问题,但我仍然不知道我做错了什么。我已经检查了堆栈溢出,我看到了由于各种原因导致的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
    }
}}
这是物品的申报单


请尽快回答我的问题,我似乎无法理解。

您使用
私有项[]itemListArray=新项[30]实例化数组
创建一个包含30个空条目的Item类型数组

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

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


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

仅实例化数组是不够的,还必须用对象填充数组。否则,默认情况下每个索引都包含null

private Item[] itemListArray = new Item[30];
for (int i = 0; i < itemListArray.length; i++) {
    itemListArray[i] = new Item();
}
private Item[]itemListArray=新项[30];
for(int i=0;i
这段代码只是创建了一个包含
null
值的数组,您需要初始化数组中的每个值

for(int i = 1;i < 31; i++)
{
    itemListArray[i].emptySlot = true; //Here is where the NPE hits
}
for(int i=1;i<31;i++)
{
itemListArray[i].emptySlot=true;//这里是NPE命中的位置
}

这个循环将导致以后出现
ArrayIndexOutOfBoundsException
,因为在Java中,有效的数组索引从0开始,然后转到array.length-1(在您的例子中是0到29),而此代码将尝试访问
itemListArray[30]

,我想您可能还不了解Java中的初始化。您只是初始化一个数组,但它没有提到真正的对象

这样的代码将有助于:

for(int i = 1;i < 31; i++){   
        Item item = new Item();
        item.emptySlot = true;
        itemListArray[i] = item; //Here is where the NPE hits
}
for(inti=1;i<31;i++){
项目=新项目();
item.emptySlot=true;
itemListArray[i]=item;//这里是NPE命中的位置
}

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

创建对象数组时,所有对象都默认为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();
}
for(int i=0;i
NPE的原因只有一个。您试图使用的是
null
可能重复的或其他100次请求中的任何一次。
for(int i = 1;i < 31; i++){   
        Item item = new Item();
        item.emptySlot = true;
        itemListArray[i] = item; //Here is where the NPE hits
}
for (int i = 0; i < itemListArray.length; i++) {
    itemListArray[i] = new Item();
}

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