/ / ArrayIndexOutOfBoundsException kann nicht abgefangen werden - Java, Android, Ausnahme, Arrayliste, Indexoutofboundsexception

Kann ArrayIndexOutOfBoundsException nicht abfangen - Java, Android, Exception, Arraylist, Indexoutofboundexception

Ich führe gerade ein IndexOutOfBoundsException dass ich nicht aufzuspüren scheint. Ich habe einen Spinner, der von a besetzt ist String[]. Je nach Hersteller des Geräts String[] (and hence Spinner object) hat entweder 3 Werte oder 1 Wert.

Ich speichere die gespeicherte Spinnerauswahl als int in dem SharedPreferences und lade es auf die Activity Schaffung.

In Fällen, in denen der Spinner nur einen Wert hat, wird der Spinner geladen SharedPreferences und der gespeicherte Wert ist 2Wenn ich den Drehknopf auf Position 2 wähle, wird er abstürzen (offensichtlich). Ich versuche, diese Ausnahme einzufangen, damit ich sie einfach einstellen kann 0, aber ich kann das nie fangen Exception.

Die Codestruktur sieht so aus:

Populate Spinner according to something
Load up Saved Preferences
Check some value of saved preferences
try{
Set Spinner with that Preference
}
catch(Exception e)
{
Set Spinner with default value of 0
}

StackTrace:

10-18 12:49:32.885: E/AndroidRuntime(15327): FATAL EXCEPTION: main 10-18 12:49:32.885: E/AndroidRuntime(15327): java.lang.IndexOutOfBoundsException: Invalid index 2, size is 1 10-18 12:49:32.885: E/AndroidRuntime(15327): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 10-18 12:49:32.885: E/AndroidRuntime(15327): at java.util.ArrayList.get(ArrayList.java:304) 10-18 12:49:32.885: E/AndroidRuntime(15327): at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337) 10-18 12:49:32.885: E/AndroidRuntime(15327): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:390)

Antworten:

1 für die Antwort № 1

Oder noch besser: Wenn Sie genau wissen, welche Ausnahme potenziell ausgelöst wird, sollten Sie diese eher als eine generische RunTimeException abfangen.

try{
Set Spinner with that Preference
}catch(IndexOutOfBoundsException e){
Set Spinner with default value of 0
}

Dies macht jedem, der Ihren Code liest, sehr klar, was passiert.

Es ist auch kein großartiger Stil, Try / Catch zu verwendenLaufzeitausnahmen behandeln. Es wäre besser, die Arraylänge zu überprüfen, bevor Sie versuchen, das Array zu verwenden. Wenn die Länge zu kurz ist, können Sie in eine andere Schleife oder etwas anderes springen und den Spinner mit dem Standardwert 0 festlegen, wobei die Ausnahme niemals ausgelöst wird. Dadurch wird der Code viel leichter lesbar, und die Wahrscheinlichkeit, dass ein anderer Entwickler vorbeikommt und nicht genau versteht, was der try / catch-Block macht, und den Code brechen, ist viel geringer.