数组的索引越界(java)



我的代码应该打印出具有最高范围的学生。在我的学生课上有一种方法可以计算范围,而在我的课堂上有另一种方法来确定哪个学生的成长率最高。我的问题出现在课堂上,学生,我在addExamScore方法中得到了一个越界异常。

主要类别:

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

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

examics[3]=82,而examics[4]会给你一个界外错误。由于您不是每次添加元素时都使用arrayList,因此您需要创建一个比当前数组大一个大小的空数组,复制以前的分数,并将新分数滑入最后一个插槽(在上面的情况下是索引4,它在新数组中不越界(。将你的新数组存储在考试[]中旧数组所在的位置。

当数组超过存储值的限制时,会显示索引越界异常。

您已在构造函数内声明了大小为"0"的数组在线路exams = new int[numExamsTaken];中使用期望的范围初始化数组的大小,或者使用ArrayList添加值,而不在先前的中指定大小

这里的代码的问题是,您试图访问数组中的一个值,而该值尚未在那里分配。这就是输出给出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网站上查看更多的List和ArrayList文档。此外,您获取最小元素的逻辑是不正确的,因为如果您没有小于0的分数,它将始终假设最小分数为0。您可以通过将初始值设置为100(测试分数的最大可能值(或使用您喜欢的其他方法来解决此问题。

最新更新