Iterator next() Nullpointer

Syny

Mitglied
Hallo Leute,
und zwar versuche ich eine Liste zu iterieren, diese dann in eine neue Liste zu speichern und danach wieder zu iterieren. Ist zwar etwas umständlich ist aber nur aus Lernzwecken da ich das später auch so machen will das nur jedes n-te Element in die neue Liste geschrieben werden soll. Allerdings bekomme ich beim adden in die Liste immer eine Nullpointer Exception :

Java:
private class SimpleListIteratorOne implements Iterator {
		Iterator<T> a;
		ArrayList<T> saveList;
		int i = 0;

		public SimpleListIteratorOne() {
			a = list.iterator();
		}

		@Override
		public boolean hasNext() {

			return a.hasNext();

		}

		@Override
		public T next() {

			return a.next();

		}

		@Override
		public void remove() {
			try {
				throw new Exception("UnsupportedOperationException");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		public Iterator<T> iterator() {

			while (hasNext()) {
				T element = next();
                //hier tritt der Fehler auf
				saveList.add(element);

			}
			return (saveList.iterator());

		}

	}

An sich ist es kein Problem das nächste Element zu bekommen nur es der Neuen Liste hinzuzufügen verursacht einen Nullpointer...

hoffe mir kann jemand dabei helfen.

MFG Syny
 
Ganz einfach, du hast nirgends ein Objekt einer ArrayList erstellt/initialisiert, lediglich deklariert hast du die saveList
 
Mir stellen sich da sowieso ein paar Fragen:

Java:
private class SimpleListIteratorOne implements Iterator {
  Iterator<T> a;
  ArrayList<T> saveList;
  int i = 0;

  public SimpleListIteratorOne() {
    a = list.iterator();
  }
Woher kommt "list"? Und zumindest "a" ist ein sehr schlechter Bezeichner für einen Iterator. "iterator" wäre besser. "i" ist auch schon grenzwertig, wozu brauchst du den int überhaupt? Und wieso definiert deine Klasse keine Typparameter "<T>"?

Java:
@Override
public void remove() {
  try {
    throw new Exception("UnsupportedOperationException");
  } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}
Wieso wirfst du nicht einfach eine [c]new UnsupportedOperationException()[/c]? Oder noch besser: einfach [c]a.remove()[/c] aufrufen.

Java:
public Iterator<T> iterator() {
  while (hasNext()) {
    T element = next();
    //hier tritt der Fehler auf
    saveList.add(element);
  }
  return (saveList.iterator());
}
Die Klammern beim return kannst du weglassen.
Prinzipiell finde ich es aber komisch, dass du ich mir von einem Iterator (was deine Klasse ja schon ist) einen weiteren Iterator holen kann. Ich denke da stimmt was in deinem Design noch nicht.

Du willst doch quasi endlos über die selbe Liste iterieren, oder?
Da müsste die Methode hasNext() dann immer true zurück geben und next() dann eben das entsprechende Element (wenn ich dich jetzt richtig verstanden habe).

Zeig doch mal den Code, wo du diesen Iterator nutzen möchtest und was der machen soll. Im Moment finde ich das hier alles etwas verwirrend, da ich nicht glaube das passiert was du willst, wenn saveList initialisiert ist. Und selbst wenn, passiert es auf eine sehr unschöne Art und Weise.
 
Zuletzt bearbeitet:

Zurück
Oben