2017-01-25 10 views
1

Я получаю исключение NullPointerException при попытке добавить объект с помощью метода InsertFront(). Код DList есть:NullPointerException в реализации Doubly Linked List

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-й строке конструктора:

head=newNode(null,head,head); 

Пожалуйста, объясните.

ответ

1

В начальном конструкторе, это не может делать то, что вы думаете, это:

head=newNode(null,head,head); 

Обратите внимание, что head является null изначально, так что вызов действительно что-то вроде этого:

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

В insertFront вы пытаетесь указать head.next.prev, но с head.next было null вы получаете исключение.

Другой способ думать о своем старом конструкторе, чтобы разложить его на 2 линии:

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

Аргументы метода оцениваются до присваивания значения переменной.