0

我目前正在造成一个IndexOutOfBoundsException我似乎无法追踪的问题。我有一个由String[]. 根据设备的制造商,这String[] (and hence Spinner object)将具有 3 个值或 1 个值。

我将保存的 Spinner 选择存储为intin并在创建SharedPreferences时加载它。Activity

在 Spinner 只有 1 个值的情况下,如果它加载SharedPreferences并且保存的值是2,我将该微调器设置为选择项目位置 2,它会崩溃(显然)。我正在尝试捕获该异常,以便我可以将其设置为0,但我似乎永远无法捕获它Exception

代码结构如下:

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
}

堆栈跟踪:

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)

4

1 回答 1

1

甚至更好:如果您确切知道可能会引发什么异常,只需捕获它而不是通用 RunTimeException。

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

这让任何阅读您的代码的人都非常清楚发生了什么。

此外,使用 try/catch 处理运行时异常也不是很好的方式。在尝试使用数组之前检查数组长度必须更好。如果长度太短,您可以进入一个 else 循环或其他东西,并将 Spinner 设置为默认值 0,并且永远不会抛出异常。这使您的代码更易于阅读,并且降低了其他开发人员出现并且不了解您的 try/catch 块正在做什么并破坏您的代码的机会。

于 2013-10-18T02:14:19.410 回答