[英]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.