Вопрос

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

Исключение в потоке "Main" java.lang.arrayindexoutofboundsexception: -1
в Project1.Entudents (Project1.java23)
at project1.mainmenu (Project1.java59)
в Project1.Entudents (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 Потому что вы пытаетесь позвонить методам с помощью нулевых ссылок - вы никогда не Создайте новый 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-- как указал другие.

Это я ... в твоей петле в Entersents. Это приводит к тому, что индекс переходит от 0 до -1, что является недействительным. Что именно это я ... должен достичь?

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top