0

我一直在尝试在 Java 中创建一个双端队列,但是当我添加一个新节点时出现空指针异常。这是我用于双向链表的辅助类:

private class Node {
    private Item item;
    private Node next;
    private Node prev;
}

然后我将节点添加到列表的开头,如下所示:

    public void addFirst(Item item) {
    Node oldfirst = first;
    first = new Node();      
    first.prev = null;
    first.item = item;
    first.next = oldfirst;
    oldfirst.prev = first;        
    N++;
}

我得到了一条NullPointer例外oldfirst.prev = first;。此外,当我编译代码时,我收到以下警告:

Warning: The field Deque2<Item>.Node.prev is never read locally

我可能做错了什么?

4

2 回答 2

0

异常表示oldfirst为空。并且您将其初始化为Node oldfirst = first,因此这意味着它first为空。

于 2012-09-15T21:12:14.473 回答
0

我的猜测是,当您的双端队列为空时,first为空。然后,当您分配firstinto时oldFirst,这将变为oldFirstnull,因此尝试访问prev会给出 NPE。更改访问权限:

if (oldFirst != null)
    oldfirst.prev = first;

应该修复它。

你的警告可能只是因为你还prev没有在你的双端队列中使用,你只是在设置它。有趣的事实:使用双端队列,您不需要双向链表,因此您的prev变量不太可能被使用。如果你还想在你的双端队列中支持排队(类似于如何LinkedList实现DequeQueue),那么你需要保留prev.

于 2012-09-15T21:19:27.233 回答