线程“main”Java.lang.ArrayIndexOutOfBoundsException中的Java异常

线程“main”Java.lang.ArrayIndexOutOfBoundsException中的Java异常,java,arrays,runtime-error,indexoutofboundsexception,Java,Arrays,Runtime Error,Indexoutofboundsexception,我正在为学校做一个项目,当我试图为数组输入学生人数时,我遇到了一个错误。错误是 主线程java.lang.ArrayIndexOutOfBoundsException中出现异常:-1 在Project1.enterStudentsProject1.java23 在Project1.mainMenuProject1.java59 在Project1.enterStudentsProject1.java7 我在下面写的代码一如既往地感谢您的帮助 import java.util.Scanner;

我正在为学校做一个项目,当我试图为数组输入学生人数时,我遇到了一个错误。错误是

主线程java.lang.ArrayIndexOutOfBoundsException中出现异常:-1 在Project1.enterStudentsProject1.java23 在Project1.mainMenuProject1.java59 在Project1.enterStudentsProject1.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实例


老实说,这个程序离工作还有很长的路要走——我不确定堆栈溢出是否能在这种特殊情况下提供最有效的教学环境。我建议你和你的老师谈谈,要求一些一对一的辅导。

这是学生们的自我循环。这会导致索引从0变为-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();
}
另外,我看到了另一个问题。初始化数组学生时,尚未为numOfStudents分配值。因为它是一个实例变量,所以默认为0,这意味着学生实际上不会容纳任何学生。

为什么

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

问题可能就在那里。您正在尝试访问一个索引号为负数的数组。

看起来这里的其他人已经指出了答案,但下面介绍了如何钓鱼

事实上,它是一个ArrayIndexOutOfBoundsException,它告诉你它是在访问数组时发生的,它甚至可以告诉你你使用的索引是越界的,在这种情况下,-1,总是越界的-数组索引必须大于等于0

enterStudents只使用一个数组,其索引始终来自一个变量。因此,请仔细阅读您的代码,并遵循变量i的值,看看它是否/如何可能为-1

顺便说一句,fori=0;iint未初始化为空。 因此,尝试编辑学生数组将不起作用

如何修复它:

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

请确定哪一行是23@TedHopp我很容易猜到是学生[I].getId;。循环从索引0开始,然后递减为-1,数组没有这样的索引。