java.lang.NullPointerException在一个小类中

时间:2014-03-15 07:57:50

标签: java nullpointerexception

我的java类会遇到NullPointerException.Please帮助! 错误消息:

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

我已在错误代码行的末尾签署了行号。

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
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这是因为ob.lastnull。设置结束的唯一时间是itemenqueue()中的第一次。而last永远不会在那里设置。在dequeue()中,如果if,它会转到ob == end块。由于end.last == null,因此ob.last == nullob.last.next也将投放NPE。