尝试在链表中查找最后一项的值时发生NullPointerException错误

时间:2018-07-28 04:42:05

标签: java nullpointerexception linked-list

我仍然是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;
    }
}

3 个答案:

答案 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之所以被抛出是因为nextnull,而您引用了next.value

您不应更改next,而应使用临时值来迭代列表的末尾。

public int getLast() {
    if (next == null)
        return value;
    List current = next;
    while (current.next != null)
        current = current.next;
    return current.value;
}