我正在尝试将前端节点出列并将其打印出来,但是我收到以下错误:
线程中的异常" main"显示java.lang.NullPointerException
at MyQueue.toString(MyQueue.java:25)
在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();
}
答案 0 :(得分:0)
您从未在previous
课程中设置MyNode
变量。
当您第一次拨打front
时,您在MyQueue
课程中设置了enqueue(T)
变量。在您第一次致电dequeue()
后,它会将front
中的MyQueue
变量设置为previous
类中从未设置的MyNode
变量。 front
类中的MyQueue
变为空,下次toString(MyNode<T>)
被调用时,您将获得NullPointerException
。
这也是第一次调用toString(MyNode<T>)
时没有给出NullPointerException
的原因。 dequeue()
尚未被调用。