2013-10-18 60 views
0

我目前正在導致我無法跟蹤的IndexOutOfBoundsException。我有一個微調器,由String[]填充。取決於設備的製造商,String[] (and hence Spinner object)將具有3個值或1個值。無法捕獲ArrayIndexOutOfBoundsException

我將保存的微調器選擇作爲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

是否有可能將異常拋出try塊?無法分辨您是否在此處發佈了這些內容。 – neurite

+0

可以肯定的是,這個錯誤是由於使用一個超出其可用選項的索引來設置微調器造成的,因爲當我刪除它時,一切都很好。我甚至包裝了整個onCreate()(從中調用這段代碼)來捕獲異常,但它仍然無法捕捉它。 – micnguyen

+0

有趣。一個級別的異常是Java Throwable。不知道是否允許你抓住它。 – neurite

回答

1

甚至更​​好:如果你知道異常可能被拋出什麼,只是趕上而不是一個泛型RunTimeException。

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

這讓任何讀取你的代碼的人都清楚發生了什麼。

此外,使用try/catch來處理運行時異常並不是很好的風格。在嘗試使用數組之前,檢查數組的長度將是更好的樣式。如果長度太短,則可以放入其他循環或其他東西,並將Spinner的默認值設置爲0,但永遠不會拋出異常。這使得你的代碼更容易閱讀,並且創建另一個開發者的機會很少,並且不能準確理解你的try/catch塊在做什麼並且破壞你的代碼。

+0

感謝您的回答。我同意你提出的解決方案要好得多 - 我很可能會改變這一點。但從純粹的教育角度來看,我不確定它爲什麼會發生。我真的有你的解決方案(捕捉確切的錯誤),但它仍然沒有抓住它。我甚至試圖在嘗試中測試整個onCreate()以測試正在發生的事情,即使如此也不能抓住它。有任何想法嗎? – micnguyen