tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
468
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Der Held Der Held ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Ort
    Erde
    Beiträge
    208
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
        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
     
    Diese Nachricht wurde elektronisch erstellt und ist auch ohne Unterschrift gültig.

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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 :
    1
    2
    3
    4
    5
    
    try {
      Iterator it = coll.iterator();
    } catch (Exception e) {
      return "Fehler: " + e.getMessage();
    }

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Der Held Der Held ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Ort
    Erde
    Beiträge
    208
    Das funktioniert nicht. Als Ausgabe erhalte ich
    Fehler: null
    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.
     
    Diese Nachricht wurde elektronisch erstellt und ist auch ohne Unterschrift gültig.

  4. #4
    TommyMo TommyMo ist offline Mitglied Brokat
    Registriert seit
    Nov 2003
    Beiträge
    261
    Hi!

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

    TOM
     
    alles Gute kommt von ...

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Der Held
    Das funktioniert nicht. Als Ausgabe erhalte ich
    Code :
    1
    
     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 :
    1
    
    return "Fehler: " + e.toString ();
    in den catch-Block. Das sollte etwas Licht ins Dunkle bringen weil zumindest der konkrete Name der Exception ausgegeben wird.

    Zitat Zitat von Der Held
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Der Held Der Held ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Ort
    Erde
    Beiträge
    208
    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.
     
    Diese Nachricht wurde elektronisch erstellt und ist auch ohne Unterschrift gültig.

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Aha. Du verwendest also tatsächlich schon die Generics von Java 5. Dann stimmt natürlich die Zuweisung die du da machst nicht.

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

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

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    Der Held Der Held ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Ort
    Erde
    Beiträge
    208
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
        /**
         * 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.
     
    Diese Nachricht wurde elektronisch erstellt und ist auch ohne Unterschrift gültig.

  9. #9
    Registriert seit
    Feb 2004
    Beiträge
    592
    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 :
    1
    2
    
    s+=it.next().toString()+"<br>";
    if (it.next().toString().equals(pattern)) it.remove();

    besser so

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    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;
        }
     

  10. #10
    Der Held Der Held ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Ort
    Erde
    Beiträge
    208
    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.
     
    Diese Nachricht wurde elektronisch erstellt und ist auch ohne Unterschrift gültig.

Ähnliche Themen

  1. XPresso Iterator
    Von axn im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 26.03.10, 21:58
  2. Matrix & Iterator
    Von schickano im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 09.01.10, 15:13
  3. Iterator liefert Mist
    Von little-smile im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 28.05.09, 18:40
  4. iterator problem
    Von sim26 im Forum Java
    Antworten: 4
    Letzter Beitrag: 01.09.06, 15:51
  5. Iterator am Anfang setzen
    Von lernen.2007 im Forum Java
    Antworten: 1
    Letzter Beitrag: 08.01.06, 00:02