luojiebin
luojiebin

Reputation: 103

java.lang.NullPointerException in a little class

My java class comps up with a NullPointerException.Please help! The error messages:

java.lang.NullPointerException at
RandomizedQueue.dequeue(52 line) at
RandomizedQueue$IndependantIterator.next (88 line) at
RandomizedQueue.main                     (104)

I have signed the line number in the end of the error code line.

import java.util.Iterator;
public class RandomizedQueue<Item> implements Iterable<Item> {
    private int number=0;
    private Node first=null;
    private Node end=null;
    private class Node {
        Item item;
        Node next=null;
        Node last=null;
    }
    private Node Random() {
        double r = Math.random();
        int n = (int) (r*number);
        if(n==0) n=1;
        Node ob=first;
        for(int i=0;i<(n-1);i++) {
            ob = ob.next;
        }
        return ob;
    }

    public RandomizedQueue() {
        Node empty=new Node();
    }
    public boolean isEmpty() {
        return number==0;
    }
    public int size() {
        return number;
    }
    public void enqueue(Item item) {
        if(item==null) throw new NullPointerException();
        number++;
        if(first==null) {
            first = new Node();
            end = first;
            first.item = item;
        }
        else {
            Node oldfirst = first;
            first = new Node();
            first.item = item;
            first.next = oldfirst;
            oldfirst.last = first;
        }   
    }
    public Item dequeue() {
        Node ob=Random();
        Item back=ob.item;
        if(ob==end) {
            end = ob.last;
            ob.last.next=null;      //52 line
        }else if(ob==first) {
            first=first.next;
            first.last=null;
        }
        else {
            ob.last.next=ob.next;
            ob.next.last=ob.last;
        }
        return back;
    }


    public Node sample() {
        return Random();
    }
    public Iterator<Item> iterator() {        
        return new IndepentRandomIterator();
    }
    private class IndepentRandomIterator implements Iterator<Item> {
        private RandomizedQueue<Item> iq = new RandomizedQueue<Item>();
        Node scan = first;
        public IndepentRandomIterator() {
            while(scan != null) {
                iq.enqueue(scan.item);
                scan=scan.next;
        }
        }
        public boolean hasNext() {
            return iq.number >0;
        }
        public void remove() {
            throw new UnsupportedOperationException();
        }
        public Item next() {
            if(iq.number==0) throw new java.util.NoSuchElementException();
            return iq.dequeue();                                           //88
        }
    }
    public static void main(String[] args) {
        RandomizedQueue<String> test = new RandomizedQueue<String>();
        test.enqueue("Luo");
        test.enqueue("Jiebin");
        test.enqueue("is");
        test.enqueue("genious");
        test.dequeue();
        test.dequeue();
        StdOut.println("Is it empty?"+test.isEmpty());
        StdOut.println("Size:       "+test.size());
        StdOut.println("A sample:   "+test.sample());
        Iterator<String> it = test.iterator();
        while(it.hasNext()) {
            String s = it.next();                         //104
        }
    }
}

Upvotes: 0

Views: 114

Answers (1)

Rebecca Abriam
Rebecca Abriam

Reputation: 560

It's because ob.last is null. The only time that end is set is when item is first in enqueue(). And last is never set there. In dequeue(), it goes to the if block if ob == end. Since end.last == null, therefore ob.last == null too and ob.last.next will throw NPE.

Upvotes: 1

Related Questions