Iterator - Fehler

Der Held

Erfahrenes Mitglied
Hallo, aus irgendeinem Grund bricht mein Programm ab, sobald ich einen Iterator zuweise. Weiss leider nicht, welche Exception geworfen wird, weil das vom Tomcat nicht ausgegeben wird (gibts da vielleicht ne Moeglichkeit den etwas aussagefreundlicher zu machen ?). Die fragliche Methode ist in einem Bean und wird aus einer JSP aus aufgerufen. Der Inhalt ist erstmal nur Quatsch, da es mir nur drum geht das Durchlaufen der Collection zu testen.

Code:
    public String kickEmptyElements(Collection coll, String pattern){
    	String s = "test";
    	if(coll!=null){
	    	Iterator it = coll.iterator();
	
	    	while(it.hasNext()){
	        	s+=it.next().toString()+"<br>";
	    		if (it.next().toString().equals(pattern)) it.remove();   		
	    	}
    	}
    	return s;
    }

Sobald ich die die Methode aufrufe krachts. Ich habe dann schrittweise auskommentiert, der Fehler liegt in der Zeile " Iterator it = coll.iterator();", da bricht das Programm ab.

Hab ich irgendwas nicht beachtet?

DH
 
Hi.

Du kannst den fehlerhaften Code Block ja einfach mal in try - catch Anweisungen schreiben - also die geworfene Ausnahme fangen und (auf den Servlet Ausgabestream) ausgeben:

Code:
try {
  Iterator it = coll.iterator();
} catch (Exception e) {
  return "Fehler: " + e.getMessage();
}

Gruß
 
Das funktioniert nicht. Als Ausgabe erhalte ich
Aber eine Exception wird ja offensichtlich geworfen, sonst kaeme es nicht zu der Ausgabe.

Vielleicht gibts ja aber auch ne viel leichtere Loesung fuer das Problem, weshalb ich eigentlich die Methode brauche. Habe eine ArrayList - Collection, bestehend aus Objekten vom Typ "Element". die Elemente deren Inhalt dem Argument pattern gleicht sollen aus der collection entfernt werden. Vielleicht gibts ja ne viel einfachere Loesung als ueber die Elemente der collection zu iterieren und die Inhalte zu vergleichen.
 
Hi!

Das hört sich nach einer NullPointerException an. Wenn du das Programm debugst, und durchstepst, welchen Wert bzw. Inhalt hat deine Collection?

TOM
 
Der Held hat gesagt.:
Das funktioniert nicht. Als Ausgabe erhalte ich
Code:
 Fehler: null
Das ist insoweit OK das es nicht unbedingt eine Detailfehlermeldung geben muß - also die Methode getMessage einer Exception kann auch null zurückgeben.

Dann schreib einfach mal
Code:
return "Fehler: " + e.toString ();
in den catch-Block. Das sollte etwas Licht ins Dunkle bringen weil zumindest der konkrete Name der Exception ausgegeben wird.

Der Held hat gesagt.:
Vielleicht gibts ja aber auch ne viel leichtere Loesung fuer das Problem, weshalb ich eigentlich die Methode brauche. Habe eine ArrayList - Collection, bestehend aus Objekten vom Typ "Element". die Elemente deren Inhalt dem Argument pattern gleicht sollen aus der collection entfernt werden. Vielleicht gibts ja ne viel einfachere Loesung als ueber die Elemente der collection zu iterieren und die Inhalte zu vergleichen.
Also wenn du Java 1.5 und Generics verwendest könntest du auch eine foreach-Schleife nehmen um über die Elemente zu iterieren. Aber sonst fällt mir spontan keine bessere Möglichkeit ein.

Gruß
 
Das wirft mir der Debugger aus:
this= ExportBean (id=122)
coll= ArrayList<E> (id=140)
elementData= Object[10] (id=155)
modCount= 3
size= 3
pattern= " "

Ich verstehe nicht warum bereits das Erhalten des Iterators von der Collection einen Fehler erzeugt. Wenn ich die Collection einfach ausgeben lasse, sieht das so aus:
[[Element: ], [Element: ], [Element: ]]
was IMHO auch richtig ist, denn sie besteht aus 3 Elementen.
 
Aha. Du verwendest also tatsächlich schon die Generics von Java 5. Dann stimmt natürlich die Zuweisung die du da machst nicht.

Code:
Iterator<Element> it = coll.iterator ();

Die foreach-Schleife kannst du übrigens doch nicht verwenden weil du ja Elemente aus der Collection entfernen willst.

Gruß
 
Generics? Nicht dass ich wuesste. Wo kommen denn im Quellcode im ersten Posting Generics vor?

Aber jetzt kommt ja erst das interessante:
Der Quellcode mit dem Fehler war sozusagen der Prototyp fuer die Methode, mit dem ich erstmal experimentieren wollte. Ich habe dann die Methode so geschrieben wie ich mir vorstelle wie das funktionieren sollte: Kein Fehler. An der Zuweisung des Iterators ist jedoch nichts anders! Warum geht denn jetzt diese Variante und die obige nicht *staun*


Code:
    /**
     * Takes a Colelction of org.jdom.Element and removes those without Attributes
     * @param coll 
     * @return the cleared Collection
     */
    private Collection kickElementsWoAttributes(Collection coll){
    	if(!coll.isEmpty()){
    		Iterator it = coll.iterator();
    		while(it.hasNext()){
    	    	Element x = (Element) it.next();
    			if(x.getAttributes().isEmpty()) {
    				it.remove();
    			}
    		}
    	}
    	return coll;  	
    }

Anmerkung:
Im Protoypen war der Rueckgabewert String um die Reuckgabe in der JSP auszugeben.
Den Parameter pattern hab ich rausgeworfen, da die Methode sowiso nur auf Elements angewandt wird und da kann ich auch gleich Attributlose rausschmeissen, anstatt die Signatur eines attributlosen Elements als String mitzuuebergeben.
 
Dein Problem liegt daran, dass du in dieser while Schleife auf dem Iterator 2 mal next() aufrufst und somit "fast" immer eine NullPointerException entsteht.

Code:
s+=it.next().toString()+"<br>";
if (it.next().toString().equals(pattern)) it.remove();

besser so

Code:
public String kickEmptyElements(Collection coll, String pattern){
    	String s = "test";
    	if(coll!=null){
	    	Iterator it = coll.iterator();
	
	    	while(it.hasNext()){

                        Object o = it.next();

	        	s+=o.toString()+"<br>";

                        // Was du hier machen willst ist mir nicht klar.
	    		//if (o.toString().equals(pattern)) it.remove();   		
	    	}
    	}
    	return s;
    }
 
Autsch! Du hast recht. Oh, darauf haett ich kommen sollen. Deshalb gehts in der finalen Version natuerlich, die ist "sauber" gechrieben. Manchmal sieht man den Wald vor lauter Baeumen nicht.

Merci an alle Beteiligten.
 

Neue Beiträge

Zurück