1

私は単純な文字列ビルダーである学校用の単純なプログラムに取り組んでいます。配列のサイズを適切に定義していますが、プログラムを実行するArrayIndexOutOfBoundsException: 0とスローされます。コンストラクター、名前、およびクラスの変数を初期化します。nameは生徒の名前、classesは生徒が毎日受けているクラスの数です。私の配列のサイズは、を使用して定義されていclassesます。これが私のコンストラクタと変数です。

protected String name = "";
protected int classes;
private String schedule = "";
private String[] course = new String[classes];
private String[] room = new String[classes];
private int[] Period = new int[classes];

public StringBuilderHandler(String name, int classes) {
    this.name = name;
    this.classes = classes;
}

文字列のスケジュールを設定するために for ループを使用しています。

private void setClass(int index) {
    Scanner scan = new Scanner(System.in);
    class[index] = scan.nextLine();
}

private void setPeriod(int index) {
    Scanner scan = new Scanner(System.in);
    period[index] = scan.nextInt();
}

public void setRoom(int index) {
    Scanner scan = new Scanner(System.in);
    room[index] = scan.nextLine();    
}

public void buildSchedule() {
    for (int i = 0; i < classes; i++) {
        System.out.println("What is your class?");
        setClass(i);
        System.out.println("What period is this class?");
        setPeriod(i);
        System.out.println("What room is this class?");
        setRoom(i);
        schedule = schedule +"Period "+period[i]+"\t"+course[i]+"\tRoom "+room[i]+"\n";
    }
}

何か案は?

4

4 に答える 4

3

コンストラクター内でオブジェクト (配列) を作成する必要があります。

private String[] course;
private String[] room;
private int[] Period;

public StringBuilderHandler(String name, int classes) {
    this.name = name;
    this.classes = classes;
    this.course = new String[classes];
    this.room = new String[classes];
    this.Period = new int[classes]; 
}
于 2012-10-06T04:49:04.770 に答える
2

クラスのインスタンス変数は、初期化していないため、デフォルト値の 0 を取得します。したがって、すべての配列はサイズ 0 で初期化されます。配列のサイズがゼロであるため、インデックス 0 がないため、例外が発生しています。クラスのインスタンス変数をゼロ以外の正の値に初期化する必要があります。

配列のサイズよりも多くの値を配列に挿入しようとすると、依然として ArrayIndexOutOfBoundsException が発生する場合があります。簡単な解決策は、配列の代わりに ArrayList を使用することです。

于 2012-10-06T04:48:11.197 に答える
2

クラスを次のように定義するだけです。

protected String name = "";
protected int classes;
private String schedule = "";
private String[] course;
private String[] room;
private int[] Period;

public StringBuilderHandler(String name, int classes) {
    this.name = name;
    this.classes = classes;
    this.course = new String[classes];
    this.room = new String[classes];
    this.Period = new int[classes]; 
}

確かにそれはうまくいくでしょう。実行時に初期化するため、クラス変数を初期化せずに使用していました。クラスに値がある場合は、コンストラクターで配列を初期化するだけです。

于 2012-10-06T05:00:55.803 に答える
0

その変数クラスをどこかで初期化しましたか?

サイズ クラスのすべての配列を初期化しましたが、クラスは初期化されていないようです。

于 2012-10-06T04:48:22.480 に答える