我的自定义类中的java.lang.NullPointerException

时间:2015-04-24 17:01:05

标签: java nullpointerexception linked-list

我希望在一个简单的链表类中实现一个Queue,而不使用java.util

当我通过enqueue方法调用List类中的addEnd方法时,我会收到java.lang.NullPointerException,但我希望第二个元素。

我可以采取哪种解决方案?

节点类

public class Node {
    private int value;
    private Node next;

    public Node(int val) { 
        value = val; 
    }

    public Node(int val, Node next) { 
        value = val; 
        this.next=next;    
    }

    public Node(Node next) { 
        this.next=next;   
    }

    public int getValue() {
        return value;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public void displayNode() { 
        System.out.print(" "+value+" "); 
    }
}

我的界面

public interface MyQueue {
    void enqueue(int oVal);
    int dequeue();
}

列表

public class List {
    private Node first;
    private Node last;
    private int counter;

    public List() {
        first = null;
        last = null;
    }

    public boolean isEmpty() { 
        return first==null; 
    }

    public void addEnd(int val) {
        Node n1 = new Node(val);
        if( isEmpty() ) {
            first = n1;
        } else {
            last.setNext(n1);
            last = n1;
        }
    }

    public int deleteStart() {
        int temp = first.getValue();
        if(first.getNext() == null){
            last = null;
            first = first.getNext();
        }
        return temp;
    }

    public void displayList() {
        Node current = first;
        while(current != null) {
            current.displayNode();
            current = current.getNext();
        }
        System.out.println("");
    }

    public int size() {
        return counter;
    }
}

队列

public class Queue implements MyQueue {
    private List listQ;

    public Queue() {
        listQ = new List(); 
    }

    public boolean isEmpty() { 
        return listQ.isEmpty(); 
    }

    public void enqueue(int oVal) { 
        listQ.addEnd(oVal); 
    }

    public int dequeue() { 
        return listQ.deleteStart(); 
    }

    public void displayQueue() {
        System.out.print("Queue  ");
        listQ.displayQueue();
    }
}



public class App {
    public static void main(String[] args) {
        Queue q1 = new Queue();
        System.out.println("Two insertions");
        q1.enqueue(4);
        q1.enqueue(64);
        q1.displayQueue();
        System.out.println("Insert at the end : ");
        q1.enqueue(23);
        q1.displayQueue();
        System.out.println("Delete an element at the begining of the queue");
        q1.dequeue();
        q1.displayQueue(); 
    }
}

2 个答案:

答案 0 :(得分:1)

@ pens-fan-69所说的是真的。我想补充一点。为了使您的代码有效,您所要做的就是确保在第一次插入期间将last设置为first:

 public void addEnd(int val) {
   Node n1 = new Node(val);
       if( isEmpty() ) {
          first=last=n1;
        } else {
            last.setNext(n1);
            last = n1;
        }             
   }

我尝试在在线编译器中运行代码并运行:http://goo.gl/99FyfY

答案 1 :(得分:0)

插入空列表时需要设置最后一个引用。 NullPointerException是因为你在设置之前使用了last。