Java 在布尔值的实例化数组上获取NPE

Java 在布尔值的实例化数组上获取NPE,java,nullpointerexception,Java,Nullpointerexception,好吧,我一直在得到一个NPE,我不明白,这是驾驶我绝对疯狂。我有一个预订对象的链接列表和一个用于跟踪可用座位的二维布尔数组: class ResList { private Reservation head; private boolean [][] seats; ResList() { head = null; //empty list boolean[][] seats = new boolean[5][25]; }

好吧,我一直在得到一个NPE,我不明白,这是驾驶我绝对疯狂。我有一个预订对象的链接列表和一个用于跟踪可用座位的二维布尔数组:

class ResList
{
    private Reservation head;
    private boolean [][] seats;

    ResList()
    {
        head = null; //empty list
        boolean[][] seats = new boolean[5][25];
    }
我还有一种方法可以用来确定是否有座位:

boolean isAvailable(int f, int s)
    {        
        if(f<0 || f>4 || s < 0 || s > 24)
            return false;
        else
            return !seats[f][s]; // this line throws the NPE
    }
但当我这么做的时候:

jcbSeat = new JComboBox();        
        for(int i = start; i <= stop; i++)
        {        
            if(list.isAvailable(selectedFlight, i))
                jcbSeat.addItem(i+1);
        }

我得到了一个NPE的注意。我在ResList构造函数中添加了一些调试行,可以很好地访问seats[][],但是当我执行该方法时,ka boom:NPE。这是怎么回事?

在构造函数中删除布尔[];您正在创建一个新的局部变量,而不是初始化实例变量


你所做的被称为阴影变量;通过使用局部变量来隐藏实例变量。这是很难找到的bug的常见来源。

在构造函数中删除布尔[];您正在创建一个新的局部变量,而不是初始化实例变量


你所做的被称为阴影变量;通过使用局部变量来隐藏实例变量。这是很难找到的bug的常见来源。

您的构造函数正在初始化局部变量seats,而不是实例变量seats。 尝试:

ResList()
{
   head = null; //empty list
   seats = new boolean[5][25];
}

构造函数正在初始化局部变量seats,而不是实例变量seats。 尝试:

ResList()
{
   head = null; //empty list
   seats = new boolean[5][25];
}
这一行不是设置类字段,而是创建一个新的变量,在构造函数内部。相反,你应该这样做

seats = new boolean[5][25];
这一行不是设置类字段,而是创建一个新的变量,在构造函数内部。相反,你应该这样做

seats = new boolean[5][25];

您正在声明并初始化构造函数中的第二个变量,即局部变量。该变量隐藏了字段席位,因此该字段永远不会被赋值,默认值为null

只需删除座位分配前的布尔值[],即可将声明+初始化转换为正常分配:

seats = new boolean[5][25];

您正在声明并初始化构造函数中的第二个变量,即局部变量。该变量隐藏了字段席位,因此该字段永远不会被赋值,默认值为null

只需删除座位分配前的布尔值[],即可将声明+初始化转换为正常分配:

seats = new boolean[5][25];

您构造的变量是错误的。您正在创建一个局部变量,而不是设置字段。改变

boolean[][] seats = new boolean[5][25];


您构造的变量是错误的。您正在创建一个局部变量,而不是设置字段。改变

boolean[][] seats = new boolean[5][25];


我是个白痴。谢谢你指出这一点。不,你没有。这是语言中的一种缺陷,我的意思是Java几乎在任何地方都显式冗长。我总是这样做来避免这种情况。seats=。您还可以打开IDE中的设置来指出这些问题。@Adam Gent,我应该自己抓住它的。我在这个项目上工作的时间太长了。我在这个问题上添加了一条评论,关于如何为Eclipse打开它。我是个白痴。谢谢你指出这一点。不,你没有。这是语言中的一种缺陷,我的意思是Java几乎在任何地方都显式冗长。我总是这样做来避免这种情况。seats=。您还可以打开IDE中的设置来指出这些问题。@Adam Gent,我应该自己抓住它的。我在这个项目上工作的时间太长了。我对如何为Eclipse打开它的问题添加了一条评论。谢谢大家。我只是个白痴。这太尴尬了,我们称之为大脑放屁。每个人都有它们,它通常需要其他人指出它们,以确保适当的尴尬——对于那些想要避免这种情况并有Eclipse阴影冲突的人来说。Windows->首选项->Java->编译器->错误/警告->命名阴影和冲突感谢所有人。我只是个白痴。这太尴尬了,我们称之为大脑放屁。每个人都有它们,它通常需要其他人指出它们,以确保适当的尴尬——对于那些想要避免这种情况并有Eclipse阴影冲突的人来说。Windows->首选项->Java->编译器->错误/警告->命名阴影和冲突