Absturz einer for-Schleife

PeterPaul

Neues Mitglied
Ich habe eine App, die bei einigen Usern abstürzt. Googles Absturzbericht verweist auf eine Codezeile, bei der ich mir keinen Fehler eklären kann:
Java:
Caused by java.lang.ArrayIndexOutOfBoundsException:
  at Taka.ai_ghzghkg.Taka.Settings.onResume (Settings.java:504)

Code:
for (int i = 1; i <= Integer.parseInt(MainActivity.TaKas[aa.getPosition(FavTxt) - 1][2]); i++)
  arrayListeSeiten.add(Integer.toString(i));

Ich habe es mehrfach geprüft und kann kein überschreiten der Arraygrenzen feststellen.

Das merkwürdige ist, daß dieser Absturz nur bei zwei Usern (von >5000) vorkommt. Beide nutzen ein Samsung mit Android 15 laut Google ANR. Bei zwei simulierten Handys ist nichts festzustellen, auf meinem realen Handy auch nicht. Und bei 99% der Nutzer eben auch nicht. Übersehe ich da irgendwas oder ist das Android 15 auf den Samsungs einfach Schuld?
 
Mit so wenig Kontext ist es sehr schwer etwas zu raten. Irgendwie muss man aber immer mit allem rechnen. Irgend etwas könnte nicht geladen worden sein, das Timing stimmt nicht weil das Programm aus dem Standby kommt oder sonst was ist passiert.

Trotzdem sieht auch der Code 'worst' aus. Statt der Umwandlung von int <--> String sollte über die Verwendung einer geeigneten Datenstruktur nachgedacht werden. Arrays sind meist die schlechteste Wahl, weil alles kompliziert und unflexibel wird. Änderungen sind dann meist sehr schwer umzusetzen und ziehen viele Anpassungen nach sich.

Dann ist das ziemlich riskant:
Java:
MainActivity.TaKas[aa.getPosition(FavTxt)][2]
Hier kann man erst mal nicht wissen was aus aa.getPosition(FavTxt) zurückkommt. Das könnte auch -1 sein, wenn FavTxt nicht gefunden wird. Oder auch ein Wert welcher die Dimension von MainActivity.TaKas überschreitet. Ich denke hier sollte eine Prüfung eingebaut werden
Java:
int pos = aa.getPosition(FavTxt);
if (pos >= 0 && pos < MainActivity.TaKas.length) {
    String value = MainActivity.TaKas[pos][2];
    try {
        int max = Integer.parseInt(value);
        for (int i = 1; i <= max; i++) {
            arrayListeSeiten.add(Integer.toString(i));
        }
    } catch (NumberFormatException e) {
        // Optional: Fehlerbehandlung, z.B. Logging oder Defaultwert
    }
}

Falls die Prüfung if (pos >= 0 && pos < MainActivity.TaKas.length) wirklich Überflüssig sein sollte, wird die JVM den Bytecode zur Laufzeit dahingehend optimieren.

Die effizienteste Methode, um in Java einen int-Wert in einen String umzuwandeln, ist die Verwendung von String.valueOf(i).
Diese Methode wird im Allgemeinen gegenüber Integer.toString(i) bevorzugt, da sie besser lesbar und null-sicher ist (beim Umgang mit Objekten).
Java:
arrayListeSeiten.add(String.valueOf(i));

Sprechende Variablennamen und ein ein paar Klammern schaden dem Ganzen auch nicht. Code muss nicht kurz sein, sondern lesbar.
 
Weiterhin könnte man das Programm "Android Logcat" mal ansehen um ungünstige Werte bei aa.getPosition(FavTxt) oder MainActivity.TaKas.length zu protokollieren. Was daten-bezogene Probleme ( get-Position ) auf den speziellen Zielgeräten nicht ausschliesst.
 
Hier kann man erst mal nicht wissen was aus aa.getPosition(FavTxt) zurückkommt. Das könnte auch -1 sein, wenn FavTxt nicht gefunden wird. Oder auch ein Wert welcher die Dimension von MainActivity.TaKas überschreitet.
[aa.getPosition(FavTxt) - 1]

Außerdem falls 0 zurückkommt folgt ebenfalls eine ArrayIndexOutOfBoundsException weil 0 - 1 = -1 ist.
 
Danke schon Mal.
Mich irritiert vor allem, daß der Fehler halt nur bei zwei Usern auftritt. Finde ich merkwürdig, wenn ein systemischer Fehler vorliegt.
 
Danke schon Mal.
Mich irritiert vor allem, daß der Fehler halt nur bei zwei Usern auftritt. Finde ich merkwürdig, wenn ein systemischer Fehler vorliegt.
Was hier passiert ist nur ein Folgefehler eines vorherigen Problems. Aus irgendeinem Grund ist das Array unvollständig. Das bekommt dein Programm aber nicht mit.Deshalb steigt es hier aus.
 

Neue Themen


Zurück
Oben