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 0
ma 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 № 1O 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.