Queue implementation in Java This is my Queue implementation in Java. Would appreciate a review of the code.

import java.util.Iterator;

public class Queue&lt;T&gt;implements Iterable&lt;T&gt; {

    private Node first, last;
    private int size;

    @Override
    public QueueIterator iterator() {
        return new QueueIterator();
    }

    private class QueueIterator implements Iterator&lt;T&gt;{
        private Node current = first;
        public boolean hasNext(){
                return current != null;
        }
        public T next(){
            T item = current.data;
            current = current.next;
            return item;
        }

    }

    private class Node{
        Node(T data){
            this.data = data;
            this.next = null;
        }
        T data;
        Node next;
    }
    public Queue(){
        first = last = null;
        size = 0;
    }

    public void enqueue(T item){
        Node p = new Node(item);
        if(first == null){
            first = last = p;
            size++;
            return;
        }
        last.next = p;
        last = p;
        size++;

    }

    public T dequeue(){

       Node p = first;
        try{
            first = first.next;
            size--;
        }catch(Exception e){
            System.out.println("Dequeing an empty queue :" + e);
        }

        return p.data;

    }


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


}
Bug

dequeue doesn't set last to null when the queue becomes empty. On the other hand, isEmpty relies on last being null.
enqueue should be streamlined to

    if (first == null) {
        first = p;
    } else {
        last-&gt;next = p;
    }
    last = p;
    size++;


to clearly state common vs different actions.