Java 删除节点时出现nullpointerexception错误

Java 删除节点时出现nullpointerexception错误,java,linked-list,nodes,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.pri

我被困在这条路上,它真的开始让我沮丧了。我想除了这一种方法外,我所有的东西都能正常工作

当我从我的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

现在,当前的测试是删除倒数第二个节点,这可能是因为head==null。下次发布错误堆栈跟踪,您将有更高的机会获得更准确的答案

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

一旦在
timeSlice()
中调用
remove()
timeSlice()
中的
curr
变量指向被删除的节点,并且
curr.getNext()
返回
null
,这会导致
NullPointerException

正如@Catherine所建议的,您应该保留对前一个节点的引用,并在列表的开头添加一个虚拟节点,以使其使用更干净。(对不起,我没有足够的代表投票支持。)


curr
上调用
remove
后,
curr
getNext()
将返回
null
。然后使用
curr
null
值进入循环的下一次迭代


您还应该检查
null
,即使您修复了它。如果你的节点为空,为什么要进入循环?

你的remove()方法的来源是什么?@Catherine the remove is upi我应该使用单链接列表,我正在使用另一个节点来断开节点之间的链接正如@Catherine所建议的,你最好保留上一个节点,并在
remove()之后用
curr
切换它
返回。否则,在单链接列表中删除没有指向上一个节点的指针的节点是不自然的。如何设置它以使其不为null?在
remove
调用中不调用
setNext(null)
将是一种方法,因为这是在循环中获取下一个节点的地方,但这不是很干净。我不确定有没有一种很好的方法可以干净利落地完成你正在做的事情。理想情况下,如果在
null
旁边设置
curr
,则在删除之前,应将
curr
设置为其上一个节点,这样循环的下一次迭代就不会出错。也许在前一个节点附近?您还可以让
remove
方法返回已删除节点的上一个节点。此外,如果要删除头部,则该建议将不起作用。也许作为头部的虚拟节点可以解决这个问题。
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
// 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());
}