2013-04-22 79 views
0

我被困在這條路上,它真的開始讓我感到沮喪。我想我有一切正常工作,但這一個方法。nullpointerexception錯誤刪除節點

當我從我的LL中刪除一個節點我得到一個空指針異常下一次嘗試,我不知道什麼。

public void timeSlice(int cpuTime){ 
    for(Node curr=head; curr.getNext()!=head; curr=curr.getNext()){ 
     curr.time=curr.time-cpuTime; 
     System.out.print("<" + curr.pid + ", " + curr.time +">" + " "); 
     //if the time remaining <= 0 then remove the node 
     if(curr.time<=0){ 
      System.out.println("\nProcess " + curr.pid + " has finished, and is now being terminated"); 
      remove(curr); 
     } 
    } 
}//end timeSlice 

它在刪除和重新啓動該方法後發生。我認爲這是因爲我剛剛刪除了curr,但我不是100%確定的。

public void remove(Node node){ 
    if(size == 0){ 
     return; 
    } 
    else if(size == 1){ 
     removeFirst(); 
    } 
    else{ 
     Node curr; 
     for(curr=head; curr.getNext()!=node; curr=curr.getNext()){ 
     ; 
     } 
     curr.setNext(curr.getNext().getNext()); 
     node.setNext(null); 
    } 
     size --; 
}//end remove 

現在目前的測試是,它會刪除倒數第二個節點

+0

你的remove()方法的來源是什麼? – Catherine 2013-04-22 02:24:24

+0

@Catherine the remove is up – kevorski 2013-04-22 02:27:46

回答

1

這可能發生,因爲頭== NULL。下次發佈錯誤堆棧跟蹤,您將有更高的機會獲得更準確的答案。

如果head爲null,則將curr設置爲null,然後在null上調用「getNext()」方法,這將導致nullPointerException。至少,這是我最好的猜測。

0

一旦remove()被稱爲在timeSlice(),在timeSlice()curr變量指向所移除的節點和curr.getNext()返回null導致NullPointerException

正如@凱瑟琳建議的,您應該保留對前一個節點的引用,並使其清單的頭部的虛擬節點更清晰。 (對不起,我沒有足夠的代表投了。)

// head.getNext() == head 
Node head = new Node(); 

public void timeSlice(int cpuTime) { 
    Node prev = head; // A dummy at head. 
    Node curr = prev.getNext(); 
    for (; curr != head; prev = curr, curr = curr.getNext()) { 
     // ... 
     if (/* remove? */) { 
      removeNext(prev); 
      curr = prev; 
     } 
    } 
} 

public void removeNext(Node node) { 
    node.setNext(node.getNext().getNext()); 
} 
+0

我應該使用一個單獨鏈接的列表,我使用另一個節點來打破節點之間的鏈接 – kevorski 2013-04-22 02:43:55

+0

正如@凱瑟琳建議的,你最好保留前一個節點並切換它在'remove()'返回後使用'curr'。否則,刪除沒有指向其前一個節點的節點在單向鏈表中不可能是自然的。 – stackless 2013-04-22 03:54:37

0

後你curr打電話removecurrgetNext()將返回null。然後你進入下一次循環,的值爲null

即使修復該問題,您也應該檢查null。如果節點爲空,爲什麼要進入循環?

+0

如何設置它,使其不會爲空? – kevorski 2013-04-22 02:45:01

+0

在你的'remove'調用中不會調用'setNext(null)'是一種方法,因爲這是你獲得循環中下一個節點的地方,但這不是很乾淨。我不確定有沒有一種很好的方法可以乾淨地做你乾淨的事情。理想情況下,如果您將'curr'設置爲'null'旁邊的內容,您可以在移除之前將'curr'設置爲其前一個節點,以便循環的下一次迭代不會被破壞。也許繼續前面的節點?你也可以讓你的'remove'方法返回被刪除的節點的前一個節點。 – Catherine 2013-04-22 02:57:11

+0

此外,如果您要刪除頭部,該建議將無法解決。也許虛擬節點作爲頭可以解決這個問題。 – Catherine 2013-04-22 03:02:19