2013-04-22 68 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