我目前正在导致IndexOutOfBoundsException
我似乎无法追查。我有一个由String[]
填充的Spinner。根据设备制造商的不同,String[] (and hence Spinner object)
将包含3个值或1个值。
我将保存的微调器选项存储为int
中的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)
答案 0 :(得分: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块正在做什么以及破坏您的代码。