NullPointerException

Porque será que eu tenho uma nullPointerException neste código depois de imprimir o último elemento da lista que também tem o valor zero n faço ideia porquê…

o problema está aqui :
public boolean hasNext() { //+
return current.next != null; //+
}

o return.current.next dá um nullpointer

[code]package SegundoTrabalhoSegundaParte;

import java.util.AbstractCollection;
import java.util.Iterator;
import java.util.NoSuchElementException;

@SuppressWarnings(“unchecked”)
public class DLinkedCollection extends AbstractCollection {
// Nó da lista duplamente ligada
private class Node {
private Object element = null; // Referencia para os dados
private Node next; // Referencia para o nó seguinte
private Node prev; // Referencia para o nó anterior
private Node(Object o, Node n, Node p) { element = o; next = n; prev = p; }
private Node() { next = prev = this; }
}

// Iterador da colecção implementada com uma lista duplamente ligada
private class LinkedIterator implements Iterator {
	//implementar
	private Node current, beforeLast ; //+
	int currentIndex; //+
	DLinkedCollection owner;

	public boolean hasNext() {			//+
		return current.next != null; //+
	}

	public boolean hasPrevious() { //+
		return current.prev != null; //+
	}


	//implementar(done)
	public Object next() {			//+
		//FALTA UMA EXCEPTION SE N HOUVER NEXT
		//beforeLast = current;
		current = current.next;		//+ não colokei o beforeLast
		currentIndex++;				//+
		return current.element;		//+
	}

	public Object previous() {		//+
		//FALTA UMA EXCEPTION SE N HOUVER PREV
		current = current.prev;  //+
		currentIndex--;  		//+
		return current.element;		//+
	}

	//implementar(done)
	public void remove() {	//+
		//FALTA UMA EXCEPCAO SE N HOUVER BEFORELAST
		current = beforeLast ; //+
		owner.removeNode(beforeLast);	//+
		beforeLast =null;	//+
		currentIndex -- ;	//+


	}
	// Implementar (done)
}

Node dummy = new Node();
int size = 0;

public int size() {	return size; }

@SuppressWarnings("unchecked")
public Iterator iterator() { return new LinkedIterator(); }

// Adiciona à lista um novo nó depois do nó passado como parâmetro
private void addNode(Node prev, Object element ) {
	// Implementar (done but )
	if (prev == null || dummy == null) 
		 throw new IllegalStateException();
	dummy.next = prev.next;
	dummy.prev = prev;
	dummy.next.prev = dummy;
	dummy.prev.next=dummy ;
	dummy.element=element;
	++size;
}

// Remove da lista o nó passado como parâmetro
private void removeNode( Node rem ) {
	dummy = rem;
	dummy.prev.next=dummy.next;
	dummy.next.prev=dummy.prev;
	--size;
}


public boolean add(Object element){ 
	addNode(dummy.prev, element); return true; 
}
public void addFirst(Object element) { addNode(dummy, element);	}
public void addLast(Object element)  { addNode(dummy.prev, element); }
public void removeFirst() {  removeNode(dummy.next); }
public void removeLast() {  removeNode(dummy.prev); }
public Object getFirst() {
	if ( size == 0 ) throw new NoSuchElementException();
	return dummy.next.element;
}
public Object getLast()  {  
	if ( size == 0 ) throw new NoSuchElementException();
	return dummy.prev.element; 
}

}
[/code]

[code]package SegundoTrabalhoSegundaParte;

public class Test {

public static void escrever( DLinkedCollection l ) {
	if ( l.isEmpty() ) System.out.println("Lista vazia");
	else {
		System.out.println("List" );
		System.out.println("  Size: " + l.size() );
		System.out.println("  First: " + l.getFirst() );
		System.out.println("  Last: " + l.getLast() );
		System.out.println("  Valores: " + l );
	}
}
public static void main(String[] args) {
	DLinkedCollection l = new DLinkedCollection();
		
	for (int i= 1; i < 5; ++ i) /*{*/
		l.add( new Integer(i) );/*System.out.println(l.size);}*/
	l.addFirst( new Integer(0) );
	//System.out.println(l.size);
	escrever( l );
	for (int i= 4; i <= 5; ++ i) 
		if ( l.contains(i)) System.out.println("A lista contém o valor " + i);
		else System.out.println("A lista não contém o valor " + i);
	l.remove(new Integer(1));
	System.out.println("Depois de remover o valor 1 " + l);
	l.removeFirst();
	System.out.println("Depois de remover o primeiro " + l);
	l.removeLast();
	System.out.println("Depois de remover o ultimo " + l);
}

}
[/code]

já resolvi o nullpointer… fiz um teste com um if ao current e resolvi o problema… mas a lista axo q continua vazia… penso k n estou a fazer o add como deve ser, o que estará mal ?

Pelo que parece a minha lista n cria novos elementos substitui o elemento existente, alguém me poderia dar uma ajuda ? é k n consigo perceber o porquê…