スレッド「Main」Java.lang.ArrayIndexOutofBoundSexceptionのJava例外
-
28-10-2019 - |
質問
学校のプロジェクトに取り組んでおり、アレイに生徒の数を入力しようとするとエラーが発生しています。エラーはです
スレッド「Main」Java.lang.ArrayIndexOutofBoundSexception:-1の例外:-1
Project1.enterstudents(project1.java23)
Project1.mainmenu(project1.java59)
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;
}
}
解決
このコードを見てください:
for(i = 0; i <= numOfStudents - 1; i++){
i--;
System.out.println("Enter student's ID: ");
students[i].getId();
次に、その価値が何であるかを説明します i
各行に行くつもりです...
なぜあなたは持っていますか i--;
ライン?
これに注意してください それだけ 最初のものに対処します ArrayIndexOutOfBoundsException
問題 - それが修正されると、あなたは別のことになります ArrayIndexOutOfBoundsException
アレイを初期化しているからです 前 要求する numOfStudents
.
一度 そうです アドレス指定されて、あなたは取得します NullPointerException
null参照を介してメソッドを呼び出そうとしているので - あなたは実際には決して 作成 新しい Student
実例。
正直に言うと、このプログラムは機能してからかなり長い道のりです。スタックオーバーフローがこの特定のケースで最も効果的な教育環境を提供するかどうかはわかりません。先生と話をして、1対1の個別指導をお願いすることをお勧めします。
他のヒント
i--;
ループ本体の上部には、可能性の高い原因があります。実際、もしそれがこの問題を引き起こさなかったなら、それはあなたのループを永遠に実行すると思います。なぜそれがそこにさえあるのですか?
また、別の問題があります。配列の場合 students
初期化されています、 numOfStudents
まだ値が割り当てられていません。インスタンス変数であるため、デフォルトは0になります。 students
実際には生徒を保持しません。
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();
}
なぜこれですか?
for(i = 0; i <= numOfStudents - 1; i++){
i--; //<--THIS
問題はおそらくそこにあります。負のインデックス番号を持つ配列にアクセスするように試行します。
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--
他の人が指摘したように。
それはi-関わっている人のループです。これにより、インデックスは0から-1になります。これは無効です。これは正確に何を成し遂げることになっていますか?
ここの他の人がすでに答えを指摘しているように見えますが、ここで釣りの方法はあります...
それがであるという事実 ArrayIndexOutOfBoundsException
アレイにアクセスしているときにそれが起こっていることを伝えています。それは、使用した範囲外のインデックスを伝えるのに十分なほど親切です(この場合、-1は常に範囲外です - アレイインデックスは必要ですbe> = 0)。
enterStudents
1つの配列のみを使用するだけで、そのインデックスは常に1つの変数から得られます。したがって、精神的にコードを介してステップを踏み出し、その変数の値に従います i
それが-1になるかどうか/方法を確認します。
ところで、 for(i = 0; i <= numOfStudents - 1; i++)
機能しますが for(i = 0; i < numOfStudents; i++)
もう少し慣用的です。