- ベストアンサー
java(エラーメッセージについて)
こんにちは。 javaの問題を解いているのですが、エラーメッセージを 解決することができません。 下記のプログラムです。 class Ex30{ public static void main(String args[]){ int week[][] ={ {50,70,80}, {80, 90, 100, 50, 70}, {60, 55, 70, 60} }; char n1[] = {'A', 'B', 'C'}; for(int i=0; i<week[i].length; i++){ System.out.print(n1[i] + "さんは" + week[i].length + "科目受講し、各科目の得点が"); for(int k=0; k<week[i].length; k++) System.out.print(week[i][k] + " "); System.out.println(""); } } } 実行結果 Aさんは3科目受講し、各科目の得点が50 70 80 Bさんは5科目受講し、各科目の得点が80 90 100 50 70 Cさんは4科目受講し、各科目の得点が60 55 70 60 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Ex30.main(Ex30.java:7) どなたかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>for(int i=0; i<week[i].length; i++){ これは、下記の間違いだと思われます。 for(int i=0; i<week.length; i++){ int[][] weekの2次元配列の全要素にアクセスする基本的な書式は 下記のとおりです。 for(int i=0; i<week.length; i++){ for(int j=0; j<week[i].length; j++){ ...week[i][j]... // 要素にアクセス } }
その他の回答 (2)
for(int i=0; i<week[i].length; i++){ System.out.print(n1[i] + "さんは" + week[i].length + "科目受講し、各科目の得点が"); これだと、「変数iがゼロからweek[i]の配列の要素数までを繰り返す」ということになります。となると、 i = 0→week[0].length = 3; i = 1→week[1].length = 5; i = 2→week[2].length = 4; となりますね。iが2のとき、条件は、for{int i = 0;i<4;i++)となることになりますから、そのままi = 3の繰り返しに進みます。そしてn1[3]の要素が見つからずエラーになります。 forのi<week[i].length;部分に、繰り返すごとに値が変化する値を設定すると予想外の動きになりますから注意しましょう。
お礼
ご回答頂きありがとうございました。 自分自身のロジックが間違っていたようです。 xxx[i].lengthはxxxの配列の要素数まで繰り返すということを 覚えておきたいと思います。 ご丁寧に解説頂きありがとうございました^^
- kuma_rider
- ベストアンサー率40% (40/100)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Ex30.main(Ex30.java:7) Ex.30の7行目でエラーが出ていることを示していると思います。 おそらく、最初の3回までループが回っていることから考えると、存在しない配列にアクセスしようとして、エラーが出ているのではと思います。 以下のように変えたら、動くでしょうか?? for(int i=0; i<week[i].length; i++){ >>>> for(int i=0; i<week[i].length-1; i++){ 実際に試してみていないので、自信はありませんが・・・
お礼
ご回答ありがとうございました。 kuma_riderさんの仰っていた通り存在しない配列にアクセスしているのが原因でした。 同じようなミスは内容心がけたいと思います。 ありがとうございました^^
お礼
ご回答ありがとうございました。 week.lengthという記述方法をもう一度復習してみたいと思います。 ありがとうございました^^