我仍然是Java的初学者-我正在尝试创建一种方法,该方法在链表中查找最后一项的值,并且抛出java.lang.NullPointerException
错误,并且表明该错误是在第21行上。据我所知,当程序员调用引用类型的变量以基本上不引用任何内容时,会发生空指针异常,因为尚未声明该变量。
例如,如果我写Integer k;
,则必须先声明k
,然后才能调用k = new Integer(10);
。如果我写int k;
,则Java会自动将值设置为0,因为它是原始类型,因此我可以直接调用它。
在这种情况下,我有点理解为什么会引发此错误,因为您可以在getLast()
方法的第二行中看到,我调用了下一步,应该是null
,因为它尚未被宣布。但是,这表明该错误在第21行,我在其中重新分配了last
。为什么?
如何解决此代码?仅供参考,这只是我学校网站上的一个实践问题,任务是完成getLast()
方法。
/*
* Class for representing a linked list of ints.
*/
public class List {
public int value;
public List next;
public List(final int setValue) {
value = setValue;
}
/**
* Return the value of the last item in the list.
*/
public int getLast() {
List current = next;
int last = next.value;
while(next != null) {
current = next;
next = current.next;
last = next.value; //ERROR
}
return last;
}
}
答案 0 :(得分:1)
您应该将移动到最后一个节点的语句作为 while 循环的最后一条语句,以便在下一次迭代时,循环条件将变为false并终止循环。对于您自己的情况,您要在到达列表末尾后尝试访问next
元素。
此外,您必须使用局部变量current
进行迭代,而不能 assign /更改 instance变量 next
。如果您下次呼叫getLast
,将无法使用,因为next
现在指向null
。
更改为
List current = next;
int last = value;//Set to the current value to begin with
while(current != null) {
last = current.value;
current = current.next;
}
return last;
答案 1 :(得分:0)
当while循环到达最后一个节点时,您可以使用以下命令将其设置为null:
next = current.next
您应该可以通过设置last = current
而不是下一步来进行修复。
但是您应该注意空列表。看来,如果您在空列表上调用getLast(),则会再次出现NullPointerException。
答案 2 :(得分:0)
NullPointerException
之所以被抛出是因为next
是null
,而您引用了next.value
。
您不应更改next
,而应使用临时值来迭代列表的末尾。
public int getLast() {
if (next == null)
return value;
List current = next;
while (current.next != null)
current = current.next;
return current.value;
}