【问题标题】:Index out of bounds for an array (java)数组的索引超出范围(java)
【发布时间】:2020-11-12 08:06:02
【问题描述】:

我的代码应该打印出范围最大的学生。在我的 Student 课程中有一种方法可以计算范围,而在我的 Classroom 课程中有另一种方法可以确定哪个学生的增长最快。我的问题出现在 Student 类中,我在 addExamScore 方法中遇到了 Out of Bounds 异常。

主类:

public class ClassroomTester 
{
    public static void main (String[] args)
    {
        Classroom c = new Classroom(2);
        
        Student ada = new Student("Ada", "Lovelace", 12);
        ada.addExamScore(44);
        ada.addExamScore(65);
        ada.addExamScore(77);

        Student alan = new Student("Alan", "Turing", 11);
        alan.addExamScore(38);
        alan.addExamScore(24);
        alan.addExamScore(31);

        c.addStudent(ada);
        c.addStudent(alan);
        c.printStudents();
        
        Student mostImproved = c.getMostImprovedStudent();
        System.out.println("The most improved student is " + mostImproved.getName());
    }
}

学生班:

public class Student
{
    private static final int NUM_EXAMS = 4;
    
    private String firstName;
    private String lastName;
    private int gradeLevel;
    private double gpa;
    
    private int[] exams;
    private int numExamsTaken;

    public Student(String fName, String lName, int grade)
    {
        firstName = fName;
        lastName = lName;
        gradeLevel = grade;
        exams = new int[numExamsTaken];
        numExamsTaken = 0;
    }
    
    public int getExamRange()
    {
    int maximum = 0;
    int minimum = 0;
    for(int i = 0; i < exams.length; i++){
        if(exams[i]<exams[minimum]){
        minimum = i;    
        }
        else if(exams[i]>exams[maximum]){
        maximum = i;    
        }
            
    }
    return exams[maximum]-exams[minimum];
    }
    
    public String getName()
    {
        return firstName + " " + lastName;
    }
    
    public void addExamScore(int score)
    {
        exams[numExamsTaken] = score;
        numExamsTaken++;
    }
    
    public void setGPA(double theGPA)
    {
        gpa = theGPA;
    }
    
    public String toString()
    {
        return firstName + " " + lastName + " is in grade: " + gradeLevel;
    }
}

【问题讨论】:

  • 您希望在exams = new int[numExamsTaken]; 创建的数组大小?是什么让你这么认为?
  • 您不能通过将元素添加到下一个索引来增大数组。您应该更改为使用列表。
  • 是的,正如其他 cmets 已经提到的 - 在 Java 中,数组具有 固定大小,它不能增长。为了允许添加更多元素,必须将数组内容复制到更大的新数组中。 ArrayList 包装了一个数组,并在需要更多容量时自动增长。

标签: java object methods


【解决方案1】:

首先,您在初始化 numExamsTaken 之前的行中在构造函数中初始化考试,顺序应该颠倒,因为您需要在使用之前知道 numExamsTaken 是什么。我建议将最大值和最小值存储为分数而不是索引,但这只是个人喜好,我认为它使代码更具可读性,这取决于你。索引越界问题可能与您的 addExamScore 方法有关。如果您参加了 4 次考试,它可能看起来像 [90, 85, 74, 82],其中索引为 0、1、2、3 和 numExamsTaken = 4。从 0 开始的索引称为零索引,并且在大多数情况下使用如果不是所有的编程语言。

exams[3] = 82 和exams[4] 会给你一个超出范围的错误。由于您不是每次要添加元素时都使用 arrayList ,因此您需要创建一个比当前数组大一个大小的空数组,复制以前的分数,并将新分数滑入最后一个槽(在上面的例子中是索引 4,它在新数组中没有超出范围)。将新数组存储在exams[] 中旧数组所在的位置。

【讨论】:

    【解决方案2】:

    当数组越界存储值时,索引越界异常显示。

    您在构造函数中声明了大小为“0”的数组 在行exams = new int[numExamsTaken]; 使用您的预期范围初始化数组的大小,或使用 ArrayList 添加值而不事先指定大小

    【讨论】:

      【解决方案3】:

      您的代码的问题在于您试图访问数组中的一个值,该值尚未在那里分配。这就是输出给出ArrayIndexOutOfBoundsException 的原因,因为您试图访问数组中超出数组范围的索引。在 Java 中,数组的大小是固定的,这意味着一旦对数组调用 new,如果不对另一个大小不同的数组调用 new,就无法更改它的大小。在这种情况下,使用List 是最简单的方法,例如ArrayList,它会为您完成所有调整大小、复制等操作,因此您可以像使用动态大小的数组一样使用它。您的代码将更改为如下所示:

      public class Student
      {
          // ...
          private List<Integer> exams;
          // ...
      
          public Student(String fName, String lName, int grade)
          {
              // ...
              exams = new ArrayList<>();
              // ...
          }
          
          public int getExamRange()
          {
              int maximum = 0;
              int minimum = 100;
              for(int i = 0; i < exams.length; i++){
                  if (exams.get(i) > maximum) {
                      maximum = exams.get(i);
                  }
                  if (exams.get(i) < minimum) {
                      minimum = exams.get(i);
                  }
              }
      
              return maximum - minimum;
          }
      
          public void addExamScore(int score)
          {
              exams.add(score);
              numExamsTaken++;
          }
      }
      

      您可以在 java API 网站上查看更多 ListArrayList 文档。此外,您获取最小元素的逻辑不正确,因为如果您没有小于 0 的分数,它将始终假定最小分数为 0。您可以通过将初始值设置为 100(最大值测试分数的可能值),或使用您喜欢的其他方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多