从泛型类型队列中取消排队,空指针异常?



我正在尝试使其取消前节点的排队并将其打印出来,但是我收到以下错误:

线程 "main" java.lang.NullPointerException
at MyQueue.toString(MyQueue.java:25) at TestQueue.main(TestQueue.java:13)
中的异常

TestQueue类开始,我期待输出 1,然后在再次取消排队 1 之后,然后从第二个toString调用中最后输出 2。

public class TestQueue {
public static void main(String[] args) {
MyQueue<String> qStr = new MyQueue();
qStr.enqueue("1");
qStr.enqueue("2");
qStr.enqueue("3");
qStr.enqueue("4");
qStr.enqueue("5");
qStr.toString(qStr.front);
qStr.dequeue();
qStr.toString(qStr.front);

}
}  

public class MyQueue<T>{
MyNode<T> back;
MyNode<T> front;
public MyQueue(){
back = null;
front = null;
}
public void enqueue(T payload) {
if(back == null) {
MyNode<T> firstnode = new MyNode<T>(payload);
back = firstnode; 
front = firstnode;
}
else {
MyNode<T> addtoback = new MyNode<T>(payload, back.next, null);
back = addtoback;

}
}
public String toString(MyNode<T> x) {
System.out.println(x.payload);
if(x.payload == null) {
return "";
}
else{
return (String) x.payload;
}
}
public void dequeue() {
if (isEmpty()) {
throw new RuntimeException("Queue underflow");
} else if (front == back) {
T payload1 = front.payload;
front = null;
back = null;
System.out.println(payload1);
}
T payload1 = front.payload;
front = front.previous;
System.out.println(payload1);
}
public Boolean isEmpty() {
if(back==null) {
return true;
}
return false;
}
public int size() {
MyNode<T> k = back;
if(isEmpty()||k.next==null) {
return 0;
}
k = k.next;
return 1+size();
}

您从未在MyNode类中设置previous变量。

正在发生的事情是,当您第一次调用enqueue(T)时,您在MyQueue类中设置了front变量。第一次调用dequeue()后,它将MyQueue中的front变量设置为MyNode类中从未设置的previous变量。MyQueue类中的front变为 null,下次调用toString(MyNode<T>)时,您将获得NullPointerException

这也是为什么第一次打电话给toString(MyNode<T>)没有NullPointerExceptiondequeue()还没有被叫来。

最新更新