我一直在尝试用Java创建一个deque,但是当我添加一个新节点时,我得到一个nullpointer异常。这是我用于双向链表的辅助类:
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
我可能做错了什么?
答案 0 :(得分:0)
该异常意味着oldfirst
为空。并将其初始化为Node oldfirst = first
,这意味着first
为空。
答案 1 :(得分:0)
我的猜测是当你的双端队列为空时,first
为空。然后,当您将first
分配到oldFirst
时,会使oldFirst
为空,因此尝试访问prev
会给出一个NPE。将访问权限更改为:
if (oldFirst != null)
oldfirst.prev = first;
应该修复它。
你的警告可能只是因为你在你的双端空间中没有使用prev
,你只是设置它。有趣的事实:使用双端队列,您不需要需要双向链表,因此不太可能使用prev
变量。如果您还希望支持排队等候排队(类似于LinkedList
实施Deque
和Queue
的方式),那么您需要保留prev
。< / p>