nullpointerexception错误删除节点

时间:2013-04-22 02:15:00

标签: java linked-list nodes

我被困在这条路上,它真的开始让我感到沮丧。我认为我的一切工作都正常,但这是一种方法。

当我从我的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,但我并不是百分之百确定。

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

现在的测试是它将删除倒数第二个节点

3 个答案:

答案 0 :(得分:1)

这可能是因为head == null。下次发布错误堆栈跟踪时,您将有更高的机会获得更准确的答案。

如果head为null,则将curr设置为null,然后在null上调用“getNext()”方法,这将导致nullPointerException。至少,这是我最好的猜测。

答案 1 :(得分:0)

remove()中调用timeSlice()后,curr中的timeSlice()变量指向已删除的节点,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()); }

正如@Catherine建议的那样,您应该保留对前一个节点的引用,并使用列表头部的虚拟节点使其使用更清晰。 (对不起,我没有足够的代表投票。)

{{1}}

答案 2 :(得分:0)

remove上致电curr后,curr的{​​{1}}将返回getNext()。然后,进入循环的下一次迭代,null的值为null

即使您修复了curr,也应检查null。如果节点为空,为什么要进入循环?