/ / Impossibile catturare ArrayIndexOutOfBoundsException - java, android, exception, arraylist, indexoutofboundsexception

Impossibile intercettare ArrayIndexOutOfBoundsException - java, android, exception, arraylist, indexoutofboundsexception

Attualmente sto causando un IndexOutOfBoundsException che non riesco a rintracciare. Ho uno Spinner che è popolato da un String[]. A seconda del produttore del dispositivo, quello String[] (and hence Spinner object) avrà 3 valori o 1 valore.

Memorizzo la selezione di Spinner salvata come un int nel SharedPreferences e caricarlo sul Activity creazione.

Nei casi in cui lo Spinner avrà solo 1 valore, se carica il SharedPreferences e il valore salvato è 2, Ho impostato lo spinner per selezionare la posizione dell'articolo 2, si bloccherà (ovviamente). Sto cercando di catturare quell'eccezione in modo che possa quindi solo impostarlo 0ma non riesco mai a capirlo Exception.

La struttura del codice è così:

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)

risposte:

1 per risposta № 1

O ancora meglio: se sai esattamente quale eccezione è potenzialmente lanciata, prendila piuttosto che una generica RunTimeException.

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

Questo rende molto chiaro a chiunque stia leggendo il tuo codice cosa sta succedendo.

Inoltre, non è un grande stile usare try / catch togestire le eccezioni di run time. Sarebbe necessario uno stile migliore per controllare la lunghezza dell'array prima di tentare di utilizzare l'array. Se la lunghezza è troppo breve, è possibile passare a un altro ciclo o qualcosa del genere e impostare lo Spinner con il valore predefinito di 0 con l'eccezione che non viene mai generata. Questo rende il tuo codice molto più facile da leggere e crea molte meno possibilità che un altro sviluppatore arrivi e non capisce esattamente cosa sta facendo il tuo blocco try / catch e rompe il tuo codice.