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

时间:2012-03-22 13:11:09

标签: java nullpointerexception

好吧,我已经得到了一个我无法弄清楚的NPE,这让我非常沮丧。我有一个预约对象的链表和一个二维的布尔数组来跟踪可用的座位:

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

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

我还有一个方法isAvailable()来确定座位是否可用:

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构造函数中添加了一些调试行,并且可以访问seat [] []就好了,但是当我执行方法时,ka-boom:NPE。这是怎么回事?

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

这行不是设置类字段seats - 它正在创建一个新的变量,在构造函数内部。相反,做

seats = new boolean[5][25];

答案 2 :(得分:1)

在你的构造函数中删除boolean [] [];您正在创建一个新的(本地)变量,而不是初始化您的实例变量。

你所做的是阴影变量;通过使用局部变量对其进行遮蔽来隐藏实例变量。这是很难找到错误的常见来源。

答案 3 :(得分:1)

您在构造函数中声明(并初始化) second 变量seats,即局部变量。该变量隐藏字段seats,因此该字段永远不会被赋值(并且将具有默认值null)。

只需将作业前面的boolean[][]移至seats即可将声明+初始化转换为正常作业:

seats = new boolean[5][25];

答案 4 :(得分:1)

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

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

seats = new boolean[5][25];