我正在尝试使其取消前节点的排队并将其打印出来,但是我收到以下错误:
线程 "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>)
没有NullPointerException
。dequeue()
还没有被叫来。