Java 试图查找最后一项时出现NullPointerException错误';链接列表中的值
我仍然是Java的初学者-我正在尝试创建一个方法来查找链表中最后一项的值,它抛出一个Java 试图查找最后一项时出现NullPointerException错误';链接列表中的值,java,nullpointerexception,linked-list,Java,Nullpointerexception,Linked List,我仍然是Java的初学者-我正在尝试创建一个方法来查找链表中最后一项的值,它抛出一个Java.lang.NullPointerException错误,它指示错误在第21行。根据我的理解,当程序员调用一个引用类型变量来基本上不引用任何内容时,就会发生空指针异常,因为该变量还没有被声明 例如,如果我写整数k,我不能调用k,直到我声明:k=newinteger(10)。如果我写intk,Java会自动将值设置为0,因为它是一个基本类型,我可以直接调用它 在本例中,我可以理解它为什么会抛出这个错误,因为
Java.lang.NullPointerException
错误,它指示错误在第21行。根据我的理解,当程序员调用一个引用类型变量来基本上不引用任何内容时,就会发生空指针异常,因为该变量还没有被声明
例如,如果我写整数k
,我不能调用k
,直到我声明:k=newinteger(10)代码>。如果我写intk代码>,Java会自动将值设置为0,因为它是一个基本类型,我可以直接调用它
在本例中,我可以理解它为什么会抛出这个错误,因为正如您在getLast()
方法的第二行中所看到的,我调用了next,它应该是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;
}
}
您应该将移动到最后一个节点的语句作为while循环的最后一个语句,以便在下一次迭代中,循环条件将变为false,循环终止。在本例中,在到达列表末尾后,尝试访问下一个
元素
public int getLast() {
if (next == null)
return value;
List current = next;
while (current.next != null)
current = current.next;
return current.value;
}
此外,必须使用局部变量current
进行迭代,而不是分配/更改实例变量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;
当while循环到达您在null旁边设置的最后一个节点时:
next = current.next
您应该能够通过设置last=current
而不是next来修复
但是你应该注意空列表。如果在空列表上调用getLast(),则可能会再次出现NullPointerException。NullPointerException
被抛出,因为next
为null
并且您引用了next.value
您不应更改下一步
,而应使用临时值迭代到列表末尾
public int getLast() {
if (next == null)
return value;
List current = next;
while (current.next != null)
current = current.next;
return current.value;
}
next
是什么意思?为什么getLast
方法更改next
?@zhhnext
是列表中的下一个节点;从技术上讲,它是一个“子列表”,其第一项是链接列表中的“下一项”。getLast
方法将next
重新分配到current
,以检查while循环中的null
。last
的初始值应为value
@zhh抱歉。我不明白你的意思。它将在循环内设置(last=current.value
)。如果列表为空,则将在此处返回0。列表不能为空,因为此本身是列表元素。@zhh-Oh。我才意识到。谢谢汉克斯,你的代码成功了。我想指出,当我将赋值last=next.value
移动到while循环的第一行时,我的代码仍然有效;但正如您所说,如果我再次调用getLast()
,它将导致错误,因为next
现在是null
。