好吧,我已经得到了一个我无法弄清楚的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。这是怎么回事?
答案 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];