当我尝试使用InsertFront()方法添加对象时,我收到NullPointerException。 DList代码是:
public class DList {
protected DListNode head;
protected int size;
protected DListNode newNode(Object item, DListNode prev, DListNode next) {
return new DListNode(item, prev, next);
}
public DList() {
head=newNode(null,head,head);
size=0;
}
public void insertFront(Object item) {
head.next.prev=newNode(item, head, head.next);
head.next=head.next.prev;
size++;
}
但是,只要我将DList构造函数更改为此错误,就不再显示此错误:
public DList() {
head=newNode(null,head,head);
head.prev=head;
head.next=head;
size=0;
}
现在,我明白指定head.next& head.prev值解决了问题;但是当我已经分配了这个“头脑”时,我不明白需要单独陈述这个内容。变量作为构造函数的第1行中的prev和next节点:
head=newNode(null,head,head);
请解释。
答案 0 :(得分:1)
在初始构造函数中,这可能不是你想象的那样:
head=newNode(null,head,head);
请注意,head
最初为null
,因此调用实际上是这样的:
head=newNode(null,null /*prev*/, null /*next*/);
在insertFront
中,您尝试引用head.next.prev
,但由于head.next
为null
,您将获得例外。
另一种思考旧构造函数的方法是将其分解为两行:
DListNode temp=newNode(null,head,head); // remember that head is null here
head=temp;
在变量赋值之前计算方法参数。