【问题标题】:Java Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException线程“主”java.lang.ArrayIndexOutOfBoundsException 中的 Java 异常
【发布时间】:2012-01-13 00:19:24
【问题描述】:

正在为学校做一个项目,当我尝试输入数组的学生人数时出现错误。错误是

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:-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;
}


}

【问题讨论】:

  • 请识别第 23 行
  • @TedHopp 我很容易猜到是students[i].getId();。循环从索引0开始,然后递减到-1,数组没有这样的索引。

标签: java arrays runtime-error indexoutofboundsexception


【解决方案1】:

看看这段代码:

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

现在算出i 的值在每一行上的含义...

你为什么有i--;这一行?

请注意,这仅解决了第一个 ArrayIndexOutOfBoundsException 问题 - 一旦修复,您将得到另一个 ArrayIndexOutOfBoundsException,因为您正在初始化数组之前 请求numOfStudents。

一旦解决,您将获得NullPointerException,因为您尝试通过空引用调用方法 - 您实际上从未创建新的Student实例。

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

【讨论】:

    【解决方案2】:

    循环体顶部的i--; 可能是罪魁祸首。事实上,如果它没有引起这个问题,我认为它会让你的循环永远运行。为什么会在那里?

    另外,我发现了另一个问题。当数组students被初始化时,numOfStudents还没有被赋值。由于它是一个实例变量,它默认为 0,这意味着 students 实际上不会保存任何学生。

    【讨论】:

      【解决方案3】:
      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();
      }
      

      【讨论】:

        【解决方案4】:

        为什么会这样?

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

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

        【讨论】:

          【解决方案5】:

          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--。

          【讨论】:

            【解决方案6】:

            在 enterStudents 的循环中是 i--。这会导致索引从 0 变为无效的 -1。这到底是什么我应该完成的?

            【讨论】:

              【解决方案7】:

              看来这里的其他人已经指出了答案,但是这里是钓鱼的方法......

              它是一个ArrayIndexOutOfBoundsException 的事实告诉你它在你访问一个数组时发生,它甚至可以告诉你你使用的索引超出了界限(在这种情况下,-1,这总是超出范围 -- 数组索引必须 >= 0)。

              enterStudents 只使用一个数组,它的索引总是来自一个变量。因此,在脑海中逐步浏览您的代码并跟踪该变量 i 的值,看看它是否/如何可能是 -1。

              顺便说一句,for(i = 0; i &lt;= numOfStudents - 1; i++) 可以,但for(i = 0; i &lt; numOfStudents; i++) 更习惯用语。

              【讨论】:

                猜你喜欢
                • 2013-01-11
                • 1970-01-01
                • 2011-09-09
                • 2016-01-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多