• ベストアンサー

処理の途中で不正な文字が表示される

学校でjavaを勉強しています。 「指定した配列と、その配列中の最大値を表示させる」という プログラムを作りたいのですが、コンパイルし実行すると ↓のように表示されてしまいます。どこに問題があるのでしょうか?教えてください。 配列a[] = { 3 最大1 1 最大5 5 4 0 5 -1 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsExcept ion: 7 at kadai5.main(kadai5.java:13) 元のプログラムは↓です。 class kadai5{ public static void main(String[] arg) { int i=0; int max=0; int[] score={3,1,5,4,0,5,-1}; int n=score.length; System.out.print("配列a[] = { "); while(i<n){ System.out.print(score[i]+" "); i=i+1; if(max<score[i]){ max=score[i]; System.out.println("最大"+max); } } System.out.println("}"+"\n\n"); System.out.println("最大値は"+max+"です。"); } }

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

  • ベストアンサー
  • zozy
  • ベストアンサー率60% (20/33)
回答No.2

ArrayIndexOutOfBoundsException とは配列の最大要素数を越えましたよという例外エラーです (プログラムの書き間違いは構文エラー、処理中に起きたエラーが例外エラー) 前提知識として、普段の数え数字とプログラムの数え数字にノ違いについて把握しましょう。 簡単に言うと"数え数字は1から数える","プログラムでは0から数える"ということです。 配列の要素は0から数えます。(プログラムの数えた方) つまり、一番最後の要素は6となります 次にscore.lengthについてです。 score.lengthとは配列scoreの長さをあらわします。 ちなみに長さは1から数えます。(通常の数え数字) 再度確認しますが ・scoreの要素番号は"6"まで ・scoreの長さは"7" そのことをふまえたうえでソースをみていきましょう //i=6の時 //6<7なのでループはtrueになりwhile文の中の処理は行われる while(i<n){ //scoreの6番目の要素(-1)を出力 System.out.print(score[i]+" "); //iに1を加える→i=7 i=i+1; //現在の最大要素よりscoreの"7番目"の要素が大きいか //ん?7番目ってあったっけ? if(max<score[i]){ max=score[i]; System.out.println("最大"+max); } } つまり、こういうことです。 ループ内で適当な順番で変数を変更すればよいというわけでうはなく、必ず正しい処理の順番というものがあります。 今回の間違いを理解できれば、間違いを正すことも用意だと思いますので頑張ってくださいね。

noname#91244
質問者

お礼

回答ありがとうございます。 配列の長さと、要素の数え方は異なるんですね。盲点でした。 わかりやすい文章で、理解することが出来ました。 なんとなく処理を並べていくのではなく、流れを考えてプログラムを作らなければなりませんね。 これからも間違えそうな点なので、気をつけたいと思います!

その他の回答 (1)

回答No.1

class kadai5{ //見づらいので出力文字列を変えています。 //Integer.toStringを使っているのは好みの問題。 public static void main(String[] arg) { int i=0; int max; int[] score={3,1,5,4,0,5,-1}; int n=score.length; if (n <= 0){ return; } //こうしておかないと配列の全ての要素が負とかの場合に対応できない max = score[0]; System.out.println("配列の各要素を出力します"); while(i<n){ System.out.println(score[i]); //最大の問題点:ここじゃない //i=i+1; if(max<score[i]){ max=score[i]; //System.out.println("現時点での最大値" + Integer.toString(score[i])); } i = i + 1; } System.out.println(""); System.out.println("最大値は"+ Integer.toString(max) +"です。"); } }

noname#91244
質問者

お礼

丁寧な回答ありがとうございます! iを入れる位置が間違っていたんですね。 この通りにプログラムを作ったところ、無事動かすことが出来ました。 配列の内容が違った場合(全て負の数など)の対応の仕方も、知らなかったので勉強になります。