我得到 java.lang.ArrayIndexOutOfBoundsException

I am getting java.lang.ArrayIndexOutOfBoundsException

我从这部分得到一个分数数组,这部分通过将每项评估的权重乘以每项评估的分数来计算总分。任何获得 -1 的标记都将自动设置为 0 且不计入。

public double totalMark(){
    int [] assessments = {2,2,2,2,1,1,1,1,2,2,1,3,70}; //Weight of each assessment
    int totalMark = 0;
    int overallmark = 0;
    for (int i : marks) //marks of each assignment
        if (marks[i] == -1) {
            assessments[i] = 0;
        }
    for (int i : marks) {
        totalMark =+ assessments[i] * marks[i];
    }
    for (int i : assessments) {
        overallmark =+ assessments[i];
    }
    return totalMark/overallmark;
}

这是我的主要方法:

public static void main(String args[]) {
    int[] samsMarks = {50, 60, 65, 60, 65, 70, 55, 66, 60, 73, 65, 45, 68, 54};
    int[] billysMarks = {50, 60, -1, 60, 65, 70, 55, 66, 60, 73, 65, 45, 68, 54};
    Student sam = new Student("1111111", samsMarks);
    Student billy = new Student("1111112", billysMarks);
    System.out.println(billy.totalMark);
}

替换你所有的

for (int i : marks)

for (int i = 0; i < marks.length; i++)

for (int i : assessments)

for (int i = 0; i < assessments.length; i++)

当您使用

for (int i : marks)

i不是marks的索引而是marks包含的元素:

50, 60, 65, 60, 65, 70, 55, 66, 60, 73, 65, 45, 68, 54

您正在使用 marks 迭代器迭代 assessments 数组,它们的长度可能不同。检查一下。

这 2 个循环非常有问题(都在访问 assessments 并且只担心 marks 长度:

for (int i : marks) //First problematic loop
    if (marks[i] == -1) {
        assessments[i] = 0;
    }
for (int i : marks) { //Second problematic loop
    totalMark =+ assessments[i] * marks[i];

如第一个答案中所述,您以这种方式使用 for:

for(element : list)

但由于您需要索引,因此应按以下形式使用它

for(initialization; termination; increment)

还有一个关于代码的建议,而不是对元素进行 3 次循环,我建议你在一次迭代中进行,你的代码可以如下所示(因为标记和赋值的元素数量相同)

for (int i = 0; i < marks.length; i++) {
    if (marks[i] == -1) {
        assessments[i] = 0;
    }
    totalMark =+ assessments[i] * marks[i];
    overallMark =+ assessments[i];
}