繁体   English   中英

数组的索引超出范围(java)

[英]Index out of bounds for an array (java)

我的代码应该打印出范围最大的学生。 在我的学生 class 中有一种方法可以计算范围,而在我的教室 class 中有另一种方法可以确定哪个学生的增长最快。 我的问题出现在 class 学生身上,我在 addExamScore 方法中遇到了越界异常。

主class:

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());
    }
}

学生 class:

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;
    }
}

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

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

索引越界异常显示数组何时越过它存储值的限制。

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

您的代码的问题是您试图访问数组中的值,该值尚未在那里分配。 这就是 output 给出ArrayIndexOutOfBoundsException的原因,因为您试图访问超出数组范围的数组中的索引。 在 Java 中,arrays 的大小是固定的,这意味着一旦你在一个数组上调用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 网站上查看更多 列表ArrayList文档。 此外,您获取最小元素的逻辑不正确,因为如果您没有小于 0 的分数,它将始终假定最小分数为 0。您可以通过将初始值设置为 100(最大值测试分数的可能值),或使用您喜欢的其他方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM