大型程序中的Index Out of Bounds异常

时间:2014-07-10 02:45:26

标签: java

我正在写一个很大的程序,它被禁止显示以下输出:

---学生------等级---字母等级

--- Student1 ----- ------ 89.37乙

等等6名学生+所有年级的最低,最高和平均值


然后它显示一个带有另一个输出的窗口:

A **(*是所有学生中A的数量)

所有成绩的最低,最高和平均值


我遇到以下错误java.lang.ArrayIndexOutOfBoundsException

代码编译但运行不正常,我无法找到错误出现的原因。我会非常感谢任何帮助。 谢谢!


import javax.swing.JOptionPane;

public class GradeCalculator extends java.lang.Object {

private static int[][] gradesMatrix = {
    {90, 100, 95, 80, 80, 90, 90, 100, 90, 87, 85, 2},
    {100, 90, 98, 100, 89, 92, 90, 100, 80, 90, 92, 5},
    {95, 86, 80, 95, 85, 80, 60, 65, 70, 76, 62, 2},
    {70, 50, 85, 70, 60, 72, 70, 80, 100, 68, 71, 0},
    {60, 47, 50, 60, 75, 60, 80, 70, 70, 45, 58, 3},
    {100, 100, 100, 100, 100, 95, 90, 100, 90, 96, 89, 5}
    };
private int[] letterCounts= {0, 0, 0, 0, 0};
private static char[] letterGrades = new char[5] ;
private double[] numberGrades = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};;


public GradeCalculator() {


}

public void letterGrades() {

    for (int k = 0; k < gradesMatrix.length; k++) {

        if (numberGrades[k] > 89.5)
        {
            letterGrades[k] = 'A';
        }
        else if (80.5 < numberGrades[k] || numberGrades[k] <= 89.5)
        {
            letterGrades[k] = 'B';
        }
        else if (69.5 < numberGrades[k] || numberGrades[k] <= 80.5)
        {
            letterGrades[k] = 'C';
        }
        else if (60.5 < numberGrades[k] || numberGrades[k] <= 69.5)
        {
            letterGrades[k] = 'D';
        }
        else if (numberGrades[k] <= 60.5)
        {
            letterGrades[k] = 'F';
        }
    }

}

public static void main(java.lang.String[] args) {

    GradeCalculator t = new GradeCalculator();

    t.totalGrades();

    String aStars = "";
    String bStars = "";
    String cStars = "";
    String dStars = "";
    String fStars = "";

    for (int m = 0; m < 5; m++)
    {
        if (letterGrades[m] == 'A')
        {
            aStars = aStars + "*";
        }
        else if (letterGrades[m] == 'B')
        {
            bStars = bStars + "*";
        }
        else if (letterGrades[m] == 'C')
        {
            cStars = cStars + "*";
        }
        else if (letterGrades[m] == 'D')
        {
            dStars = dStars + "*";
        }
        else if (letterGrades[m] == 'F')
        {
            fStars = fStars + "*";
        }
    }

    String message = String.format("A  %s\nB  %s\nC  %s\nD  %s\nF %s\nMin: %f\nMax: %f\nMean: %f\n",
        aStars, bStars, cStars, dStars, fStars, t.minGrade(), t.maxGrade(), t.meanGrade());

    JOptionPane.showMessageDialog (null, message,
                     "Grade Calculator",JOptionPane.INFORMATION_MESSAGE);

}

public double maxGrade() {

    double maxGrade = 0;

    for (int a = 0; a < numberGrades.length; a++)
    {
        if (numberGrades[a] > maxGrade)
        {
            maxGrade = numberGrades[a];
        }
    }
    return maxGrade;
}

public double meanGrade() {

    double meanGrade;
    meanGrade = (numberGrades[0] + numberGrades[1] + numberGrades[2] +
        + numberGrades[3] + numberGrades[4] + numberGrades[5])/6.0;


    return meanGrade;
}

public double minGrade() {

    double minGrade = 150.0;

    for (int b = 0; b < numberGrades.length; b++)
    {
        if (numberGrades[b] < minGrade)
        {
            minGrade = numberGrades[b];
        }
    }

    return minGrade;
}

public void totalGrades() {

    int studentNum = 0;
    GradeCalculator p = new GradeCalculator();

    for (int i = 0; i < gradesMatrix.length; i++)
    {
        numberGrades[i] = Math.round((( ((gradesMatrix[i][0] +
            + gradesMatrix[i][1] + gradesMatrix[i][2])/300.0)*0.2 +
            + ((gradesMatrix[i][3] + gradesMatrix[i][4] +
            + gradesMatrix[i][5])/300.0)*0.3 + ((gradesMatrix[i][6] +
            + gradesMatrix[i][7] + gradesMatrix[i][8])/300.0)*0.05 +
            + ((gradesMatrix[i][9] + gradesMatrix[i][10])/200.0)*0.45 ) *//x
            100.0 + gradesMatrix[i][11]) * 100.0)/100.0 ;

        studentNum++;

        System.out.printf("Student%-7d %-5.2f  %s%n", studentNum,
                          numberGrades[i], letterGrades[i]);

    }

    System.out.printf("%nMin: %.2f%nMax: %.2fMean: %.2f", p.minGrade(), p.maxGrade(), p.meanGrade());

}




}

4 个答案:

答案 0 :(得分:0)

gradesMatrix大于numberGradesletterGrades,但是当您输出每个学生的总数时,您使用相同的变量(i)索引其中的三个。

这就是它抛出IndexOutOfBoundsException

的原因

答案 1 :(得分:0)

如果您使用大量数组并在多个维度中使用该数组,那么您可能会失去对数组的控制,例如,您需要精确计算该值以确保没有出现错误。 我建议您可以使用明确的对象映射来管理您使用的数据,不要直接使用数组。可能将数据插入数据库将是一个更好的解决方案。

答案 2 :(得分:0)

您的for循环索引基于gradesMatrix

for (int k = 0; k < gradesMatrix.length; k++) {

然而,您正在使用索引访问numberGrades

中的元素
if (numberGrades[k] > 89.5)

letterGrades

letterGrades[k] = 'B';

numberGrades 发生gradesMatrix(它的第一个维度)具有相同数量的元素,不会崩溃 (虽然这可能是错的)。但是,由于letterGrades的元素少于gradesMatrix,因此当您尝试访问不存在的第六个元素(在索引5处)时会产生IndexOutOfBoundsException

答案 3 :(得分:0)

这是因为当你要在for循环中使用 totalGrades 时,我们正在使用 System.out.printf(&#34;学生%-7d%-5.2f%s%n&#34;,studentNum,numberGrades [i],letterGrades [i]);

numberGrades 数组在循环中长度为5且等级矩阵数组长度大于5 ,因此迭代numberGrades从索引中获取值不存在。