从泛型类型队列中出列,空指针异常?

时间:2018-02-17 23:05:29

标签: java pointers exception null queue

我正在尝试将前端节点出列并将其打印出来,但是我收到以下错误:

  

线程中的异常" 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();
}

1 个答案:

答案 0 :(得分:0)

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

当您第一次拨打front时,您在MyQueue课程中设置了enqueue(T)变量。在您第一次致电dequeue()后,它会将front中的MyQueue变量设置为previous类中从未设置的MyNode变量。 front类中的MyQueue变为空,下次toString(MyNode<T>)被调用时,您将获得NullPointerException

这也是第一次调用toString(MyNode<T>)时没有给出NullPointerException的原因。 dequeue()尚未被调用。