Verwirrende Fehlermeldung

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

Verwirrende Fehlermeldung

Beitragvon ds10 » 23 Sep 2011, 01:12

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: 1209
Registriert: 13 Jan 2008, 05:07
Wohnort: Radebeul

Re: Verwirrende Fehlermeldung

Beitragvon v6ph1 » 23 Sep 2011, 01:30

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: 1817
Registriert: 02 Jul 2009, 14:32

Re: Verwirrende Fehlermeldung

Beitragvon uzi » 23 Sep 2011, 07:38

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: 16231
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Verwirrende Fehlermeldung

Beitragvon ds10 » 23 Sep 2011, 09:57

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

Beitragvon AlexG » 23 Sep 2011, 12:57

Oder verwende an der Stelle einen Iterator, musst dann auch nicht die Liste von hinten abarbeiten.

v6ph1
Site Admin
Beiträge: 1209
Registriert: 13 Jan 2008, 05:07
Wohnort: Radebeul

Re: Verwirrende Fehlermeldung

Beitragvon v6ph1 » 23 Sep 2011, 13:50

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: 16231
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Verwirrende Fehlermeldung

Beitragvon ds10 » 23 Sep 2011, 14:04

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

Beitragvon ohhteriiii » 27 Jan 2015, 05:55

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


Zurück zu „Mithelfen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste