何が原因ArrayIndexOutOfBoundsException
ですか?
変数を値を配置できる「ボックス」と考える場合、配列は互いに隣り合って配置された一連のボックスであり、ボックスの数は有限で明示的な整数です。
次のような配列を作成します。
final int[] myArray = new int[5]
それぞれがを保持する5つのボックスの行を作成しますint
。各ボックスには、インデックス、一連のボックス内の位置があります。このインデックスは0から始まり、N-1で終わります。Nは配列のサイズ(ボックスの数)です。
この一連のボックスから値の1つを取得するには、次のように、インデックスを介して値を参照できます。
myArray[3]
これにより、シリーズの4番目のボックスの値が得られます(最初のボックスのインデックスは0であるため)。
ArrayIndexOutOfBoundsException
最後に、「ボックス」、または負の屈折率より高いインデックスを渡すことによって、存在しない「ボックス」をretriveしようとによって引き起こされます。
私の実行例では、これらのコードスニペットはそのような例外を生成します。
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
回避する方法 ArrayIndexOutOfBoundsException
を防ぐためにArrayIndexOutOfBoundsException
、考慮すべきいくつかの重要なポイントがあります。
ループ
配列をループする場合は、取得するインデックスが配列の長さ(ボックスの数)よりも厳密に小さいことを常に確認してください。例えば:
for (int i = 0; i < myArray.length; i++) {
通知は<
、ミックス決して=
そこに..
次のようなことをしたくなるかもしれません:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
しないでください。(インデックスを使用する必要がある場合は)上記のものに固執すると、多くの苦痛を軽減します。
可能な場合は、foreachを使用します。
for (int value : myArray) {
これにより、インデックスについて考える必要がまったくなくなります。
ループするときは、何をしても、ループ反復子の値を変更しないでください(ここでは:)i
。値を変更する唯一の場所は、ループを続行することです。それ以外の方法で変更すると、例外が発生するリスクがあり、ほとんどの場合、必要はありません。
取得/更新
配列の任意の要素を取得するときは、それが配列の長さに対して有効なインデックスであることを常に確認してください。
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}