Java 删除节点时出现nullpointerexception错误
我被困在这条路上,它真的开始让我沮丧了。我想除了这一种方法外,我所有的东西都能正常工作 当我从我的LL中删除一个节点时,我在下一次尝试时会得到一个空指针异常,我不知道是什么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
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());
}