Seite 1 von 1

Verwirrende Fehlermeldung

Verfasst: 23 Sep 2011, 01:12
von ds10
Ich habe hier einen interessanten Fall, folgende Codestelle produziert eine IndexOutOfBoundsException in der if-Bedinung.

Code: Alles auswählen

      for (int i=list.size() - 1; i >= 0; i--) {
        for (String zipName : zipThemes) {
          if (list.get(i).getName().equalsIgnoreCase(zipName) && !(list.get(i) instanceof ZipIconTheme)) {
            list.remove(i);
          }
        }
      }
So wie ich das sehe, kann an der Stelle keine IndexOutOfBoundsException entstehen, denn oben wird i ja eindeutig auf Größe der Liste minus eins gesetzt, d.h. der Index i muss innerhalb der Listengröße liegen. :?: :?: :?:

Re: Verwirrende Fehlermeldung

Verfasst: 23 Sep 2011, 01:30
von v6ph1
Nachdem das erste mal die If-Abfrage (für diesen Schleifendurchlauf) erfolgreich war, kommt es beim nächsten Durchlauf zur Exception.
Bei solchen kleinen Zahlen passiert das recht selten.
Lösung:
Einfach aus der inneren Schleife nach dem list.remove(i); rausspringen.

Code: Alles auswählen

      for (int i=list.size() - 1; i >= 0; i--) {
        for (String zipName : zipThemes) {
          if (list.get(i).getName().equalsIgnoreCase(zipName) && !(list.get(i) instanceof ZipIconTheme)) {
            list.remove(i);
            break;
          }
        }
      }
Gibt es dafür nicht evtl. einen besseren Weg?
Ne HashMap oder sowas?

mfg
v6ph1

Re: Verwirrende Fehlermeldung

Verfasst: 23 Sep 2011, 07:38
von uzi
v6ph1 hat geschrieben:Nachdem das erste mal die If-Abfrage (für diesen Schleifendurchlauf) erfolgreich war, kommt es beim nächsten Durchlauf zur Exception.
huh? nein. wieso? deshalb geht er doch von hinten nach vorn durch.

[edit] ach jetzt versteh ich dich. ja. du hast recht. beim nächsten durchlauf der INNEREN schleife. richtig.

[edit] ich frage mich an der stelle eher, warum da instanceof benutzt wird. und das sogar erst als 2. bedingung. aber ohne größeren kontext lässt sich das schlecht bewerten ;).

Re: Verwirrende Fehlermeldung

Verfasst: 23 Sep 2011, 09:57
von ds10
Der größere Kontext ist tvbrowser.core.icontheme.IconLoader.getAvailableThemes().
Aber der Fehler ist ja gefunden, danke v6ph1.

Re: Verwirrende Fehlermeldung

Verfasst: 23 Sep 2011, 12:57
von AlexG
Oder verwende an der Stelle einen Iterator, musst dann auch nicht die Liste von hinten abarbeiten.

Re: Verwirrende Fehlermeldung

Verfasst: 23 Sep 2011, 13:50
von v6ph1
AlexG hat geschrieben:Oder verwende an der Stelle einen Iterator, musst dann auch nicht die Liste von hinten abarbeiten.
Dann muss man aber unbedingt die remove-Funktion des Iterators nehmen.
Und die innere Schleife muss man trotzdem abbrechen.

Wenn ich den kompletten Code richtig interpretiere, werden erst die gezipten Themes in eine zweite Liste geschrieben.
Und dann die Ordner, die zu den gezipten Themes gehören raussortiert.
Um doppelte Einträge zu vermeiden und den gezipten Themes den Vorang zu gewähren.

Mittels Set und passender Equals-Funktion könnte man das beim Eintragen bereits prüfen und bei Zip-Themes eine ausnahme machen.

Also erst alle in eine Temp-Liste einfügen.
Diese dann abarbeiten und die Elemente (falls nicht vorhanden oder Zip) in das Set einfügen.
Beim Einfügen der gezipten die ungezipte Variante aus dem Set rauswerfen.

mfg
v6ph1

Re: Verwirrende Fehlermeldung

Verfasst: 23 Sep 2011, 14:04
von ds10
Ich denke nicht, dass ich da jetzt was ändern muss. Es funktioniert ja, wenn die Schleife abgebrochen wird und nur darauf kommt es an.

Re: Verwirrende Fehlermeldung

Verfasst: 27 Jan 2015, 05:55
von ohhteriiii
Wenn ich den kompletten Code richtig interpretiere, werden erst die gezipten Themes in eine zweite Liste geschrieben. Und dann die Ordner, die zu den gezipten Themes gehören raussortiert.???

___________________
GuL