• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:なんで例外出力されるんですか?)

なぜ例外が出力されるのか?

このQ&Aのポイント
  • プログラム中で発生したjava.lang.ArrayIndexOutOfBoundsExceptionという例外の原因と意味を説明します。
  • 配列を操作するメソッドの中で、不正なインデックスを使って配列にアクセスしてしまった場合に、java.lang.ArrayIndexOutOfBoundsExceptionという例外が発生します。
  • 実際のコードの中で例外が出力される場所とその原因を解説します。ソースコード内のidexやnの値によって、配列の範囲外にアクセスしてしまい、例外が発生する可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.4

・a.length: 6 ・idx: 1 ・n: 3 のとき、 ・tmp.length: 3 ・iの変化する範囲: 4~5 です。 tmp[]の添字は0~2だけが有効なので、tmp[i]に値を代入しようとしたらArrayIndexOutOfBoundsExceptionが出るのは当然。

skybkird
質問者

お礼

返すは配列は0から2までなのに4~5の範囲の値を代入してしまって例外出力されたんですね そりゃ起きますね、なんで質問するときまではわからなかったんだろ

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> 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]; } 等と途中経過を出力するなりすれば、あなたの思った通りに動いてないことがすぐわかるはずです

skybkird
質問者

お礼

「プログラムは思った通りに動かない。書いた通りに動く」 いい言葉です。自分はこうだと思っても動作が違うなら決めつけないようにします

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

>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)
回答No.1

 こんにちは 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 は、同じ添え字でいいんですか?

skybkird
質問者

お礼

ダメですね、質問してわかりました 云われてみれば配列tmpの範囲は0から2まで、iは4~5まですね そりゃ例外されて当たり前な話でしたね、なんでこんなこと気づかなかったんだろ・・・ 逆にa[i]を代入する返す配列tmpのiにn個分まで引いたらいけそうです