2015-02-08 43 views
0

我試圖將點添加到鏈接列表中,以便跟蹤每個數據條目的頻率。每次我運行這段代碼,它都會給我一個NullPointerException。我不明白爲什麼,對我來說,似乎在它增加了它造成的差距之後,但我似乎無法修復它。鏈接列表,不斷獲取NullPointerException

if(firstNode == null) 
    { 
     addPair = new Pair(aData, 1); 
     firstNode = new Node(null, addPair, null); 
     lastNode = firstNode; 
     currentNode = firstNode; 
     numberOfNodes++; 
    } 
    else 
    { 
     currentNode=firstNode; 
     for(int count = 0; count<numberOfNodes; count++) 
      { 
       if(currentNode.data.fst().equals(aData)) 
       {         
        addPair = new Pair(aData,currentNode.data.freq()+1); 
        if(count==0) 
         firstNode= new Node(currentNode,addPair,null); 
        currentNode = new Node(currentNode,addPair,null); 
        break; 
       } 
       if(count == (numberOfNodes-1) && currentNode.data.fst() !=(aData)) 
        { 
          addPair = new Pair(aData,1); 
          Node newNode = new Node(currentNode, addPair, null); 
          currentNode.next = newNode; 
          lastNode = newNode; 
          numberOfNodes++; 
          break; 
         } 
         currentNode = currentNode.next; 
        } 

    } 

    numberOfEntries++; 

    private class Node 
{ 
    private Node previous; 
    private Pair data; 
    private Node next; 

    private Node(Node previousNode, Pair<T,Integer> addPair, Node nextNode) 
    { 
     previous = previousNode; 
     data = addPair; 
     next = nextNode; 
    } 
}  
+0

能否請您分享您的堆棧跟蹤? – Mureinik 2015-02-08 21:10:58

+4

如何向我們展示'Node'類?基本上,我們要求我們在乾草堆裏找到一根針,但只給我們一小堆乾草堆頂上的乾草,看看。 – 2015-02-08 21:13:10

+0

添加節點類 – AHxRazr 2015-02-08 21:20:28

回答

0

如果是在該行if(currentNode.data.fst().equals(aData))接收NPE然後要麼currentNode == nullcurrentNode.data == nullcurrectNode.data.fst() == null。在診斷問題時要做的第一件事是找出哪些是這種情況。我建議你把下面的語句這一行之前並重新運行代碼:

assert currentNode != null; 
assert currentNode.data != null; 
assert currentNode.data.fst() != null; 

除此之外診斷有多種方式,你可以使你的代碼更安全。首先你確實沒有必要使用count來迭代你的鏈表。更安全會結束的時候,next指針null

for (Node current = firstNode; current != null; current = current.next) { 
    if (current.data.equals(aData)) { 
     // increment counter 
     return; 
    } 
} 
0

的主要問題是在這條線

firstNode= new Node(currentNode,addPair,null); 

當您增加第一個節點,你不設置在下Node的頻率,所以你只有一個節點的列表,但大小很多。與行類似的問題

currentNode = new Node(currentNode,addPair,null); 

也全部首先if聲明是錯誤的。你是破壞列表裏的鏈接,它應該是這樣的

if (currentNode.data.fst().equals(aData)) { 
    addPair = new Pair(aData, currentNode.data.freq() + 1); 
    // create new node 
    Node c = new Node(currentNode.previous, addPair, currentNode.next); 
    // set links to new node 
    if (currentNode.previous != null) { 
     currentNode.previous.next = c; 
    } 
    if (currentNode.next != null) { 
     currentNode.next.previous = c; 
    } 
    if (count == 0) { 
     firstNode = c; 
    } 
    break; 
} 

簡化代碼,減少可能出現的錯誤,我可以推薦給喜歡寫一些incFrequency()功能Pair類。然後在循環做這樣的事

if (currentNode.data.fst().equals(aData)) { 
    currentNode.data.incFrequency(); 
    break; 
} else if(count == (numberOfNodes-1) && currentNode.data.fst() !=(aData)) { 
    // add new node to the end 
} 

你也可以重寫你for循環

currentNode = firstNode; 
// iterate through list 
while (currentNode != null) { 
    // process currentNode 
    ... 
    // move to the next node 
    currentNode = currentNode.next; 
}