- ベストアンサー
なぜ例外が出力されるのか?
- プログラム中で発生したjava.lang.ArrayIndexOutOfBoundsExceptionという例外の原因と意味を説明します。
- 配列を操作するメソッドの中で、不正なインデックスを使って配列にアクセスしてしまった場合に、java.lang.ArrayIndexOutOfBoundsExceptionという例外が発生します。
- 実際のコードの中で例外が出力される場所とその原因を解説します。ソースコード内のidexやnの値によって、配列の範囲外にアクセスしてしまい、例外が発生する可能性があります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
・a.length: 6 ・idx: 1 ・n: 3 のとき、 ・tmp.length: 3 ・iの変化する範囲: 4~5 です。 tmp[]の添字は0~2だけが有効なので、tmp[i]に値を代入しようとしたらArrayIndexOutOfBoundsExceptionが出るのは当然。
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
> for(int i=idex+n; i<a.length; i++){ > int[] tmp=new int[a.length-n]; と宣言しているのだから、 tmpで使える添字は tmp[0] から tmp[a.length-n-1] までですよね? > for(int i=idex+n; i<a.length; i++){ > tmp[i]=a[i]; ということは、このforループでは tmp[idex+n] = a[idex+n] ; tmp[idex+n+1] = a[idex+n+1] ; ... tmp[a.length-1] = a[a.length-1] ; を実行しようとする。 nが1以上なら a.length-n-1< a.length-1 であり、 tmp[a.length-1] が不正なのはあきらか。 「プログラムは思った通りに動かない。書いた通りに動く」という格言があります。 「自分はこう思う」と確信していても、動作が思い通りでないなら、まずは、自分が間違っている、と考えることです。 デバッガを使うなり for(int i=idex+n; i<a.length; i++){ System.out.println("tmp[" + i + "] = a[" + i + "] =" + a[i]); tmp[i]=a[i]; } 等と途中経過を出力するなりすれば、あなたの思った通りに動いてないことがすぐわかるはずです
お礼
「プログラムは思った通りに動かない。書いた通りに動く」 いい言葉です。自分はこうだと思っても動作が違うなら決めつけないようにします
- wormhole
- ベストアンサー率28% (1626/5665)
>int[] tmp=new int[a.length-n]; >for(int i=idex+n; i<a.length; i++){ >tmp[i]=a[i]; >} tmpで扱える添え字の範囲と、iの値をよく考えてみましょう。
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは private static int[] arrayRmvOfn(int[] a, int idex, int n) { int[] tmp=new int[a.length-n]; for(int i=idex+n; i<a.length; i++){ tmp[i]=a[i]; ↑ ここがヒント } return tmp; } 配列 tmp と a は、同じ添え字でいいんですか?
お礼
ダメですね、質問してわかりました 云われてみれば配列tmpの範囲は0から2まで、iは4~5まですね そりゃ例外されて当たり前な話でしたね、なんでこんなこと気づかなかったんだろ・・・ 逆にa[i]を代入する返す配列tmpのiにn個分まで引いたらいけそうです
お礼
返すは配列は0から2までなのに4~5の範囲の値を代入してしまって例外出力されたんですね そりゃ起きますね、なんで質問するときまではわからなかったんだろ