Verwirrende Fehlermeldung

Du willst mithelfen? Hier gibt es die Möglichkeit dazu!
Antworten
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Verwirrende Fehlermeldung

Beitrag 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. :?: :?: :?:
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
v6ph1
Site Admin
Beiträge: 1276
Registriert: 13 Jan 2008, 05:07
Wohnort: Radebeul

Re: Verwirrende Fehlermeldung

Beitrag 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
uzi
Site Admin
Beiträge: 2293
Registriert: 02 Jul 2009, 14:32

Re: Verwirrende Fehlermeldung

Beitrag 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 ;).
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Verwirrende Fehlermeldung

Beitrag von ds10 »

Der größere Kontext ist tvbrowser.core.icontheme.IconLoader.getAvailableThemes().
Aber der Fehler ist ja gefunden, danke v6ph1.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
AlexG
Full Member
Beiträge: 97
Registriert: 31 Dez 2007, 15:21

Re: Verwirrende Fehlermeldung

Beitrag von AlexG »

Oder verwende an der Stelle einen Iterator, musst dann auch nicht die Liste von hinten abarbeiten.
v6ph1
Site Admin
Beiträge: 1276
Registriert: 13 Jan 2008, 05:07
Wohnort: Radebeul

Re: Verwirrende Fehlermeldung

Beitrag 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
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Verwirrende Fehlermeldung

Beitrag 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.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
ohhteriiii
Newbie
Beiträge: 1
Registriert: 27 Jan 2015, 05:51

Re: Verwirrende Fehlermeldung

Beitrag 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
Antworten