2013-10-08 117 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);