みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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)
どなたかよろしくお願いします。

投稿日時 - 2007-09-04 23:34:39

QNo.3316186

困ってます

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

>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]... // 要素にアクセス
 }
}

投稿日時 - 2007-09-05 08:48:15

お礼

ご回答ありがとうございました。
week.lengthという記述方法をもう一度復習してみたいと思います。
ありがとうございました^^

投稿日時 - 2007-09-05 21:20:12

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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;部分に、繰り返すごとに値が変化する値を設定すると予想外の動きになりますから注意しましょう。

投稿日時 - 2007-09-05 00:43:02

お礼

ご回答頂きありがとうございました。
自分自身のロジックが間違っていたようです。
xxx[i].lengthはxxxの配列の要素数まで繰り返すということを
覚えておきたいと思います。
ご丁寧に解説頂きありがとうございました^^

投稿日時 - 2007-09-05 21:55:12

ANo.1

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++){

実際に試してみていないので、自信はありませんが・・・

投稿日時 - 2007-09-05 00:31:31

お礼

ご回答ありがとうございました。
kuma_riderさんの仰っていた通り存在しない配列にアクセスしているのが原因でした。
同じようなミスは内容心がけたいと思います。
ありがとうございました^^

投稿日時 - 2007-09-05 21:57:28