Исключение Java в потоке "main" java.lang.ArrayIndexOutOfBoundsException - PullRequest
0 голосов
/ 05 декабря 2011

Работа над проектом для школы, и я получаю сообщение об ошибке, когда пытаюсь ввести количество учеников для массива. Ошибка

Исключение в потоке "main" 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;
}


}

Ответы [ 7 ]

8 голосов
/ 05 декабря 2011

Посмотрите на этот бит кода:

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 экземпляр.

Если честно, эта программа довольно далека от работы - я не уверен, что переполнение стека обеспечит наиболее эффективную среду обучения в данном конкретном случае. Я бы посоветовал вам поговорить со своим учителем и попросить провести урок 1-на-1.

1 голос
/ 05 декабря 2011

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--, как указано другими.

1 голос
/ 05 декабря 2011

Почему это?

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

Проблема, вероятно, есть.Вы пытаетесь получить доступ к массиву с отрицательным индексом.

1 голос
/ 05 декабря 2011

i--; в верхней части вашего тела цикла является вероятным виновником.На самом деле, если бы это не вызывало этой проблемы, я думаю, это заставило бы ваш цикл работать вечно.Почему это даже там?

Кроме того, я вижу еще одну проблему.Когда массив students инициализирован, numOfStudents еще не было присвоено значение.Поскольку это переменная экземпляра, по умолчанию используется значение 0, что означает, что students фактически не будет содержать учеников.

1 голос
/ 05 декабря 2011
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();
}
0 голосов
/ 05 декабря 2011

Похоже, что другие здесь уже указали ответ, но вот как ловить рыбу ...

Тот факт, что это ArrayIndexOutOfBoundsException, говорит о том, что это происходит, когда вы обращаетесь к массиву, и даже достаточно любезно сообщить вам, что индекс, который вы использовали, выходит за пределы (в данном случае -1, который всегда выходит за пределы - индексы массива должны быть> = 0).

enterStudents использует только один массив, и его индекс всегда происходит из одной переменной. Итак, мысленно пройдитесь по своему коду и следуйте значениям этой переменной i, чтобы увидеть, может ли / когда она когда-либо быть -1.

Кстати, for(i = 0; i <= numOfStudents - 1; i++) будет работать, но for(i = 0; i < numOfStudents; i++) немного идиоматичнее.

0 голосов
/ 05 декабря 2011

Это i-- в вашем цикле в enterStudents.Это приводит к тому, что индекс изменяется от 0 до -1, что недопустимо.Что именно это я должен сделать?

...