我正在获取java.lang.ArrayIndexOutOfBoundsException

时间:2018-11-06 12:32:59

标签: java arrays indexoutofboundsexception

我将从本节中获得一个不完整的分数阵列,本节通过将每个评估的权重乘以每个评估的分数来计算总分数。任何获得-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);
}

3 个答案:

答案 0 :(得分:3)

替换所有

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

答案 1 :(得分:0)

如第一个答案中所述,您以这种方式使用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];
}

答案 2 :(得分:-1)

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

这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];