質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

ArrayIndexOutOfBoundsExceptionの解決方法を教えてください。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 179

前提・実現したいこと

先ほどの質問から引き続き、コマンドライン引数から成績を処理するコードをつくっている途中に以下のエラーメッセージが発生しました。
解決方法を教えてください。お願いします。
ちなみにコマンドライン引数は以下の通りです。
「Anne 100 Glbert 99 Diana 60 Emily 89 Bryce 79 Jane 74 Kilmeny 42 Marigold 64」

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
    at hello.Seiseki1.main(Seiseki1.java:14)

該当のソースコード

package hello;

public class Seiseki1 {


    public static void main(String[] args) {
        int i;
        int total = 0;
        int n = args.length/2;
        String names[] = new String[n];
        double score[][] = new double[n][2];

        for(i = 0; i <args.length; i += 2 ) {
           names[i] = args[i];
           score[i][0] = Double.parseDouble(args[i + 1]); 
           total += score[i][0];
        }
           double average = (total/(args.length/2));
           double ssum = 0.0;
           ssum += sqr(score[i][0] - average);
           double variance = ssum / (args.length/2);
           double sd = Math.sqrt(variance);
           double hensachi = 50 + (score[i][0] - average)/sd * 10;


            System.out.println("Average = " + average);
               System.out.println("Standard Deviation = " + sd);

        for(i = 0; i <score.length; i++) {
           score[i][1] = hensachi;


        System.out.print("    " + names[i] + "    ");
        System.out.print(score[i][0] + "    ");
        System.out.println(hensachi);
        }


    }



    private static double sqr(double d) {
        return d * d;
    }
}

試したこと

forの条件式を変えたりしたのですが、うまくいきません。

補足情報

最終的な形は以下の通りにしたいと思っています。

Average = 75.9
Standard Deviation = 18.85
    Anne    Glbert    Diana    Emily    Bryce    Jane    Kilmeny    Marigold    
Score    100    99    60    89    79    74    42    64        
StdScr    62.8    62.3    41.6    57.0    51.7    49.0    32.0    43.7
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

at hello.Seiseki1.main(Seiseki1.java:12)

Seiseki1.javaの12行目で例外が発生しているという意味です。

 names[i] = args[i];

となっていますが、namesがnullです。

private static String[] names;

ループに入るまえに

names = new String[n] として、String配列を作成してください。

n に入る数値は、いくつになるか、計算できますよね?

同様に、score の方も初期化してください。

score = new double[n][2];


ArrayIndexOutOfBoundsException への対応

配列を初期化してみたのですが、ArrayIndexOutOfBoundsExceptionが同じくnames[i] = args[i];の部分で発生してしまいます(泣)。

ArrayIndexOutOfBoundsExceptionは、配列の要素以上のindexに値を設定しようとしたさいに起こるものです。Exceptionのメッセージを確認してみてください。
nが8の場合、i が 8以上の時に、設定できません。(namesのインデックスは0~7の8個)
i = 0 のときに、names[0]、 i = 2 のときに、names[1]、 ・・・ i = 8 のときに、names[4]
に格納するのではないでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/08 15:06

    配列を初期化してみたのですが、ArrayIndexOutOfBoundsExceptionが同じくnames[i] = args[i];の部分で発生してしまいます(泣)。

    キャンセル

  • 2020/07/08 16:41 編集

    ArrayIndexOutOfBoundsExceptionは、配列の要素以上のindexに値を設定しようとしたさいに起こるものです。Exceptionのメッセージを確認してみてください。
    nが8の場合、i が 8以上の時に、設定できません。
    i = 0 のときに、names[0]、 i = 2 のときに、names[1]、 ・・・ i = 8 のときに、names[4]
    に格納するのではないでしょうか?

    キャンセル

  • 2020/07/08 16:48

    あ、質問を変えちゃうと回答が質問と整合性があわなくなるので、別の質問を作成してほしいです。

    キャンセル

0

ナカミがnullの変数に対してなにかをしようとするとその例外が出ます
そいつが出た行で使用されている変数の値をチェックして、nullのものをさがしましょう。
そして、それがなぜそうなってるのか、そうならないようにするにはどうすればいいのか、を考えましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る