2013-10-08 116 views
0

這是一個學生班,我創建了一個名字,年級和身份證號碼的學生。學生用作TreeMap中的鍵,而學生的成績用作值。我寫的compareTo爲我實現可比,但在進入第一個學生這個錯誤彈出:爲什麼這個數組不一致?

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

我認爲它是從學生的姓名的分裂進入一個String [],但我測試了那些稱爲姓和名的行,以及分隔名稱的行,它們似乎都按照預期工作,除了在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); 
    } 
} 
+0

您是否輸入學生姓名而不是**空格分隔**在同一行中的名字和姓氏? –

+0

發佈您的整個錯誤消息,包括追溯。 –

+0

固定。該錯誤在測試器中引用'last = stuName [1];'在構造函數中,'Student s = new Student(name,id,grade);'。 – ocbd

回答

2

可能是因爲你有兩個不同的迴路,具有不同指數的:在你的一個循環

,從1開始,這樣的話你是1名學生短:

for (int i = 1; i < numStudents; i++){ 
在刪除環

你有一個基於0的索引:

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

我懷疑,你認爲你增加了2個studends,但你真的只有一個(在索引0),因此你的索引界限例外。

編輯,OP增加了一個「完全」堆棧異常,和上面的回答是不相關的業務方案的問題.....

答2:根據修改後的堆棧/異常編輯,唯一可能的答案是,有在學生的名字沒有空格.....你的說法,總有一個空間,根本不是這麼回事....

您可能希望向計qualifiewr添加到拆分以便您在任何無效輸入上都會得到一個空字符串:

stuName = n.split(" ", 2);