ArrayIndexOutOfBoundsException`の意味と対処法を教えてください。
例外を発生させるコードサンプルを紹介します。
String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
System.out.println(name[i]);
}
最初に参照すべきなのは、それなりに明確に説明されているドキュメントです。
不正なインデックスで配列にアクセスされたことを示すためにスローされます。インデックスは負の値か配列のサイズ以上の値です。
つまり、例えば
int[] array = new int[5];
int boom = array[10]; // Throws the exception
どうやって回避するかというと...うーん、やめたほうがいいですね。配列のインデックスに注意してください。
よくある問題として、配列のインデックスが1であると考えてしまうことがあります。
int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
System.out.println(array[index]);
}
これでは最初の要素(インデックス0)を見逃してしまい、インデックスが5のときに例外が発生してしまいます。正しい、慣用的な for
文は次のようになります。
for (int index = 0; index < array.length; index++)
(もちろん、インデックスが必要であると仮定しています。代わりに強化されたforループを使えるならそうしてください)
if (index < 0 || index >= array.length) {
// Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
// Yes, you can safely use this index. The index is present in the array.
Object element = array[index];
}
更新:あなたのコードスニペットの通りです。
for (int i = 0; i<=name.length; i++) {
インデックスは配列の長さを含んでいます。これは境界を越えています。<=を
<` に置き換える必要があります。
for (int i = 0; i < name.length; i++) {
これは、配列のインデックスにアクセスしようとしていることを意味していますが、これはバウンドの間にないため有効ではありません。
例えば、これはプリミティブな整数配列を上限値4で初期化します。
int intArray[] = new int[5];
プログラマーはゼロから数えます。例えばこれは、上限が5ではなく4であるため、ArrebileIndexOutOfBoundsException
を投げることになります。
intArray[5];