0

これは私が持っている Student クラスで、名前、学年、ID 番号を持つ学生を作成します。Student は TreeMap のキーとして使用され、学生の成績は値として使用されます。私はComparableを実装しているのでcompareToを書きましたが、最初の学生に入るとこのエラーがポップアップします:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Student.<init>(Student.java:25)
    at Main.main(Main.java:50)
Java Result: 1

学生の名前を文字列 [] に分割したことが原因だと思いますが、姓名を呼び出す行と、名前を分割する行をテストしましたが、すべて意図したとおりに機能しているようですただし、compareTo で呼び出される場合を除きます。

どんな助けでも大歓迎です。

public class Student implements Comparable<Student>{
    private String name, grade, first, last;
    private String[] stuName;
    private int id;

    /**
     * Constructs a new Student with a name, ID Number, and a grade.
     * @param n name
     * @param i ID Number
     * @param g grade
     */
    public Student(String n, int i, String g){
        name = n;
        id = i;
        grade = g;
        stuName = n.split(" ");
        first = stuName[0];
        last = stuName[1];
    }

    /**
     * Compares Students. First by last name, then by first if the last names
     * are the same.  If the first names are also the same, the students are
     * compared by their ID Numbers.
     * @return the value upon comparing the proper property of the Student
     */
    @Override
    public int compareTo(Student other){
        if (last.equals(other.getLast())){
            if (first.equals(other.getFirst())){
                return id - other.getID();
            }else
                return first.compareTo(other.getFirst());
        }
        return last.compareTo(other.getLast());
    }

    /**
     * Changes the student's current grade.
     * @param g new grade
     */
    public void changeGrade(String g){
        grade = g;
    }

    /**
     * Returns student's name.
     * @return name
     */
    public String getName(){
        return name;
    }

    /**
     * Returns student's first name.
     * @return first name
     */
    public String getFirst(){
        return first;
    }

    /**
     * Returns student's last name.
     * @return last name
     */
    public String getLast(){
        return last;
    }

    /**
     * Returns the student's grade.
     * @return grade
     */
    public String getGrade(){
        return grade;
    }

    /**
     * Returns the student's ID Number
     * @return id number
     */
    public int getID(){
        return id;
    }

テスター:

public class Main {
    public static void main(String[] args) throws InterruptedException{
        Map<Student, String> students = new TreeMap();
        Scanner in = new Scanner(System.in);
        System.out.println("How many students do you want to add?");
        int numStudents = in.nextInt();
        String name, grade;
        int id;


        for (int i = 1; i < numStudents; i++){
            System.out.println("Name of student " + i + "?");
            name = in.nextLine();
            in.nextLine();

            System.out.println("Grade of " + i + "?");
            grade = in.nextLine();

            System.out.println("ID Number of " + i + "?");
            id = in.nextInt();

            Student s = new Student(name, id, grade);
            students.put(s, s.getGrade());
        }


        System.out.println("How many students do want to remove");
        int remStudents = in.nextInt();

        for (int i = 0; i < remStudents; i++){
            System.out.println("ID?");
            int remID = in.nextInt();

            for (Student s : students.keySet()){
                if (s.getID() == remID){
                    students.remove(s);
                }
            }
        }


        System.out.println("How many grades do you want to change?");
        int changeGrades = in.nextInt();

        for (int i = 0; i < changeGrades; i++){
            System.out.println("ID?");
            int foo = in.nextInt();
            System.out.println("New grade?");
            String newGrade = in.nextLine();

            for (Student s : students.keySet()){
                if (s.getID() == foo){
                    s.changeGrade(newGrade);
                }
            }
        }

        String printout = "";
        for (Student s : students.keySet()){
            printout += s.getLast() + ", " + s.getFirst() + " (" + s.getID() + "): " + s.getGrade() + "\n";
        }
        System.out.println(printout);
    }
}
4

1 に答える 1

2

おそらく、異なるインデックスを持つ 2 つの異なるループがあるためです。

1 つのループでは、1 から開始するため、1 人の生徒が不足しています。

for (int i = 1; i < numStudents; i++){

削除ループでは、0 から始まるインデックスがあります。

for (int i = 0; i < remStudents; i++){

あなたは 2 人の生徒を追加したと思っていますが、実際には (インデックス 0 で) 1 つしかないため、インデックス範囲外の例外が発生したと思われます。

編集、OPは例外用に「フル」スタックを追加しました。上記の回答はOPの問題とは関係ありません.....

回答 2: 修正されたスタック/例外の編集に基づくと、可能な唯一の答えは、学生の名前にスペースがないことです.... 常にスペースがあるというあなたの主張は、単に真実ではありません....

分割にカウント修飾子を追加して、無効な入力に対して空の文字列を取得することができます。

stuName = n.split(" ", 2);
于 2013-10-08T01:45:11.140 に答える