2017-01-25 79 views
1

當我嘗試使用InsertFront()方法添加對象時,出現NullPointerException。該DLIST代碼:NullPointerException在雙鏈表實現中

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值解決了問題;但我不明白什麼是需要seperately,說明這個時候我已經分配的「頭」變量在構造函數中的第一行的prev和next節點:

head=newNode(null,head,head); 

請解釋。

回答

1

在最初的構造,這可能不是做什麼,你認爲它是:

head=newNode(null,head,head); 

注意headnull開始,所以調用的是真的是這樣的:

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

insertFront您嘗試引用head.next.prev,但由於head.nextnull你會得到一個例外。

另一種方式去思考你的老構造是將其分解成2行:

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

方法參數的賦值的變量之前評估。