Java 试图查找最后一项时出现NullPointerException错误';链接列表中的值

Java 试图查找最后一项时出现NullPointerException错误';链接列表中的值,java,nullpointerexception,linked-list,Java,Nullpointerexception,Linked List,我仍然是Java的初学者-我正在尝试创建一个方法来查找链表中最后一项的值,它抛出一个Java.lang.NullPointerException错误,它指示错误在第21行。根据我的理解,当程序员调用一个引用类型变量来基本上不引用任何内容时,就会发生空指针异常,因为该变量还没有被声明 例如,如果我写整数k,我不能调用k,直到我声明:k=newinteger(10)。如果我写intk,Java会自动将值设置为0,因为它是一个基本类型,我可以直接调用它 在本例中,我可以理解它为什么会抛出这个错误,因为

我仍然是Java的初学者-我正在尝试创建一个方法来查找链表中最后一项的值,它抛出一个
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
?@zhh
next
是列表中的下一个节点;从技术上讲,它是一个“子列表”,其第一项是链接列表中的“下一项”。
getLast
方法将
next
重新分配到
current
,以检查while循环中的
null
last
的初始值应为
value
@zhh抱歉。我不明白你的意思。它将在循环内设置(
last=current.value
)。如果列表为空,则将在此处返回0。列表不能为空,因为
本身是列表元素。@zhh-Oh。我才意识到。谢谢汉克斯,你的代码成功了。我想指出,当我将赋值
last=next.value
移动到while循环的第一行时,我的代码仍然有效;但正如您所说,如果我再次调用
getLast()
,它将导致错误,因为
next
现在是
null