開発をしていて起きた例外とその解決・回避方法を記載します。
今回は「ArrayIndexOutOfBoundsException」について記載します。
ArrayIndexOutOfBoundsExceptionって何?
ArrayIndexOutOfBoundsExceptionをはじめて見て戸惑っている方、何故起きているのか分からない方もいると思いますので説明をしますと
不正なインデックスを使って配列がアクセスされたことを示すためにスローされます。
つまり、インデックスが負または、配列のサイズ以上の場合です。
引用:Java™ Platform Standard Edition 7
ということです。そのままの意味ですね。
解決・回避方法は?
「不正なインデックスで配列にアクセスすると起きる」ので、
要素数を把握したうえでインデックスを指定すれば起きません。
サンプルコード
以下をメモ帳やエディタにコピペしてください。
まずはArrayIndexOutOfBoundsExceptionを起こします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Sample{ public static void main(String[] args){ String[] str = new String[ 3 ]; str[ 0 ] = "とまと" ; str[ 1 ] = "じゃがいも" ; str[ 2 ] = "にんじん" ; str[ 3 ] = "たまねぎ" ; System.out.println(str[ 1 ]); } } |
これを実行してみますと…
ArrayIndexOutOfBoundsExceptionが起きました。
5行目で3つの要素数で配列を作ると記述しています、
これは存在しないインデックスを指定し値を代入しようとしたため起きたということが分かるかと思います。
もしインデックスの3に値を入れたいのであれば要素数を4で作る必要がありますし
そもそも要素数が3で正しいのであればstr[3]の記述を消す必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Sample{ public static void main(String[] args){ /* 要素数を4にする */ String[] str = new String[ 4 ]; str[ 0 ] = "とまと" ; str[ 1 ] = "じゃがいも" ; str[ 2 ] = "にんじん" ; str[ 3 ] = "たまねぎ" ; System.out.println( "要素数を4にする:" + str[ 1 ]); /* 要素数はそのまま3、str[3]の記述を消す */ String[] str = new String[ 4 ]; str[ 0 ] = "とまと" ; str[ 1 ] = "じゃがいも" ; str[ 2 ] = "にんじん" ; System.out.println( "str[3]の記述を消す:" + str[ 1 ]); } } |
どちらのやり方でも例外はでず「じゃがいも」と表示されました。
おまけ
ArrayIndexOutOfBoundsExceptionは前回やったIndexOutOfBoundsExceptionの派生クラスで(同じようなものではあるけど)厳密には違います。
ただ、内部的の配列や処理的な話になってきますので、とりあえず以下だけ押さえておいてもらえれば。
ArrayListで存在しないインデックスを指定する→IndexOutOfBoundsException
配列で存在しないインデックスを指定する→ArrayIndexOutOfBoundsException
まとめ
・ArrayIndexOutOfBoundsExceptionは不正なインデックスで配列にアクセスすると起きる例外
・要素数を把握したうえでインデックスを指定すれば起きない
・ArrayIndexOutOfBoundsExceptionはIndexOutOfBoundsExceptionの派生クラス
今回はArrayIndexOutOfBoundsExceptionを紹介しました。
こんな感じかなぁーと配列を書いていたところ起きた例外だったので、やっぱりだめかと思いつつも「IndexOutOfBoundsExceptionとは何が違うんだろう?」と考えさせられました。
気になったら詳しく調べてみてくださいね!