双向链表中的NullPointerException实现

时间:2017-01-25 17:19:22

标签: java list data-structures collections nullpointerexception

当我尝试使用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);

请解释。

1 个答案:

答案 0 :(得分:1)

在初始构造函数中,这可能不是你想象的那样:

head=newNode(null,head,head);

请注意,head最初为null,因此调用实际上是这样的:

head=newNode(null,null /*prev*/, null /*next*/);

insertFront中,您尝试引用head.next.prev,但由于head.nextnull,您将获得例外。

另一种思考旧构造函数的方法是将其分解为两行:

DListNode temp=newNode(null,head,head); // remember that head is null here
head=temp;

在变量赋值之前计算方法参数。