0

学校のプロジェクトに取り組んでいますが、配列の生徒数を入力しようとするとエラーが発生します。エラーは

スレッド「main」の例外java.lang.ArrayIndexOutOfBoundsException:-1
at Project1.enterStudents(Project1.java23)
at Project1.mainMenu(Project1.java59)
at Project1.enterStudents(Project1.java7)

いつものように私が以下に書いたコードはどんな助けでもありがたいです。

import java.util.Scanner;

public class Project1{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
Project1 project1 = new Project1();
project1.mainMenu();


}//main

int numOfStudents;
Student[] students = new Student[numOfStudents];

public void enterStudents(){
    Scanner input = new Scanner(System.in);
    System.out.println("Enter number of students");
    numOfStudents = input.nextInt();
    int i;
    for(i = 0; i <= numOfStudents - 1; i++){
        i--;
        System.out.println("Enter student's ID: ");
        students[i].getId();
        System.out.println("Enter student's first name: ");
        students[i].getFirst();
        System.out.println("Enter student's last name: ");
        students[i].getLast();
        System.out.println("Enter student's class: ");
        students[i].getStuClass();
    }


}

public void retrieveStuId(){
    Scanner input = new Scanner(System.in);
    System.out.println("Enter student id");


}

public void Exit(){
    System.exit(0);
}

public void mainMenu(){
    Scanner input = new Scanner(System.in);
    System.out.println("1 - Enter student info");
    System.out.println("2 - Retrieve student by ID");
    System.out.println("3 - Retrieve student by last name");
    System.out.println("4 - Update student");
    System.out.println("5 - Exit");
    int menuSelect = input.nextInt();

    if (menuSelect != 1 && menuSelect != 2 && menuSelect != 3 && menuSelect != 4 && menuSelect != 5)
        System.out.println("That is not a option");
    else
        switch (menuSelect){
            case 1: enterStudents();

            case 2: System.out.print("case 2");

            case 3: System.out.print("case 3");

            case 4: System.out.print("case 4");

            case 5: Exit();

        }
}

}//project1

class Student{
private int studentID;
private String firstName;
private String lastName;
private String stuClass;

public Student(){
}

public Student(int id, String first, String last, String c ){
    studentID = id;
    firstName = first;
    lastName = last;
    stuClass = c;
}

public void setID (int id){
    studentID = id;
}

public void  setStuClass (String c){
    stuClass = c;
}

public void setFirst(String first){
    firstName = first;
}

public void setLast(String last){
    lastName = last;
}

public String getFirst(){
    return firstName;
}

public String getLast(){
    return lastName;
}

public int getId(){
    return studentID;
}

public String getStuClass(){
    return stuClass;
} 

public String toString(){
    return "Student ID: " + studentID + " ---- " + "Student Name: " + firstName + "" + lastName + " ---- " + "Class:" + stuClass;
}


}
4

7 に答える 7

8

このコードを見てください:

for(i = 0; i <= numOfStudents - 1; i++){
    i--;
    System.out.println("Enter student's ID: ");
    students[i].getId();

i次に、各行の値がどうなるかを計算します...

なぜあなたはi--;まったくラインを持っているのですか?

これは最初の問題にのみ対処することに注意してください。これArrayIndexOutOfBoundsExceptionが修正されると、を要求するArrayIndexOutOfBoundsExceptionに配列を初期化しているため、別の問題が発生することになります。numOfStudents

これに対処すると、NullPointerExceptionnull参照を介してメソッドを呼び出そうとしているため、実際に新しいインスタンスを作成することはありません。Student

正直なところ、このプログラムは機能するまでにはかなり長い道のりです。この特定のケースでStackOverflowが最も効果的な教育環境を提供するかどうかはわかりません。先生に相談して、1対1の個別指導を依頼することをお勧めします。

于 2011-12-05T07:42:08.693 に答える
1
for(i = 0; i <= numOfStudents - 1; i++){
// REMOVE THIS        i--;
// i is = -1 here but Arrays start by 0
    System.out.println("Enter student's ID: ");
    students[i].getId();
    System.out.println("Enter student's first name: ");
    students[i].getFirst();
    System.out.println("Enter student's last name: ");
    students[i].getLast();
    System.out.println("Enter student's class: ");
    students[i].getStuClass();
}
于 2011-12-05T07:42:56.720 に答える
1

ループ本体のi--;上部が原因である可能性があります。実際、それがこの問題を引き起こしていなければ、あなたのループは永遠に続くと思います。なぜそれがそこにあるのですか?

また、別の問題も見られます。配列studentsが初期化されるとき、numOfStudentsまだ値が割り当てられていません。これはインスタンス変数であるため、デフォルトは 0 です。これは、students実際には Student を保持しないことを意味します。

于 2011-12-05T07:43:32.820 に答える
1

なぜこれ?

for(i = 0; i <= numOfStudents - 1; i++){
        i--; //<--THIS

問題はおそらくそこにあります。負のインデックス番号を持つ配列にアクセスしようとしています。

于 2011-12-05T07:44:24.500 に答える
1

int numOfStudents何も初期化されません。そのため、学生の配列を編集しようとしても機能しません。

修正方法:

Scanner input = new Scanner(System.in);
System.out.println("Enter number of students"); 
int numOfStudents = input.nextInt(); //this initializes to something.
Student[] students = new Student[numOfStudents];

次に、データを収集するループを続行します。

もちろん、他のi--人が指摘したように削除したいでしょう。

于 2011-12-05T07:58:55.673 に答える
0

これは、enterStudents のループ内の i-- です。これにより、インデックスが 0 から -1 に変更されますが、これは無効です。これは正確には何を-- 達成することになっているのですか?

于 2011-12-05T07:43:07.730 に答える
0

ここにいる他の人がすでに答えを指摘しているように見えますが、釣り方は次のとおりです...

それが であるという事実はArrayIndexOutOfBoundsException、配列にアクセスしているときに発生していることを示しており、使用したインデックスが範囲外であることを伝えるのに十分親切です (この場合、-1 は常に範囲外です)。 -- 配列インデックスは >= 0 でなければなりません)。

enterStudentsは 1 つの配列のみを使用し、そのインデックスは常に 1 つの変数から取得されます。したがって、精神的にコードをステップ実行し、その変数の値をたどって、i-1 になるかどうか、またはその方法を確認してください。

ところで、for(i = 0; i <= numOfStudents - 1; i++)動作しますfor(i = 0; i < numOfStudents; i++)が、もう少し慣用的です。

于 2011-12-05T07:45:27.790 に答える