0

私は現在、IndexOutOfBoundsException追跡できないように見える問題を引き起こしています。が取り込まれたスピナーがありString[]ます。デバイスの製造元に応じて、String[] (and hence Spinner object)3 つの値または 1 つの値のいずれかになります。

保存した Spinner の選択内容を として保存intし、作成SharedPreferences時にロードします。Activity

スピナーの値が 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 ループまたは何かにドロップして、スピナーをデフォルト値 0 に設定し、例外がスローされないようにすることができます。これにより、コードが非常に読みやすくなり、別の開発者がやって来て、try/catch ブロックの動作を正確に理解せずにコードを壊してしまう可能性が大幅に低くなります。

于 2013-10-18T02:14:19.410 に答える