我正在写一个很大的程序,它被禁止显示以下输出:
---学生------等级---字母等级
--- 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());
}
}
答案 0 :(得分:0)
gradesMatrix
大于numberGrades
和letterGrades
,但是当您输出每个学生的总数时,您使用相同的变量(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从索引中获取值不存在。