Java - 并行数组上的 ArrayIndexOutOfBounds 错误

标签 java indexoutofboundsexception

我在这个项目上遇到了一些麻烦:

我们收到一个包含 5 名学生的文本文件,每个名字后面有 4 个数字成绩,各占一行。我们必须使用 main 方法来读取文件,然后在成绩簿类中执行计算。然而,根据类里面其他人的说法,我们使用的方法充其量是过时的,涉及并行数组。不过,我们似乎确实没有其他选择,所以我正在尽我所能。但在我希望这段代码结束时,我遇到了一个问题,它说包含学生成绩的索引超出范围。

我已经用多种不同的方式重写了 main 中的 readFile 方法,但无论如何我仍然遇到这些错误。谁能帮助我了解发生了什么事?我会发布我能发布的一切。 如果我在这方面有点慢/无能,我也深表歉意,不幸的是,这是我几个月来第一次编写 java 代码。

此外,在我发布的错误中,主类的第 64 行是:grades[test] = inputFile.nextDouble();

run:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at Package1.GradeBookDemo.readFile(GradeBookDemo.java:64)
    at Package1.GradeBookDemo.main(GradeBookDemo.java:29)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

以下是我的主要方法:

import java.util.Scanner;
import java.io.*;

public class GradeBookDemo {

    public static void main(String[] args) throws IOException {

        // Create a new gradebook object
        Gradebook gradeBook = new Gradebook();

        //Read StudentInfo file for names and test scores using readFile method
        readFile(gradeBook);

        //Output Student data
        for (int index = 1; index <= 5; index++)
        {
            System.out.println("Name: " + gradeBook.getName(index) + 
                    "\tAverage Score: " + gradeBook.getAverage(index) +
                    "\tGrade: " + gradeBook.getLetterGrade(index));
        }

    }


    // This method reads from the StudentInfo file
    public static void readFile(Gradebook gradeBook) throws IOException
    {

        int nI = 0; // Name index
        int gI = 4; // Grade index

        // Create a string array to hold student names and another for grades
        double[] grades = new double[gI];

        // Access the StudentInfo text file
        File sFile = new File("StudentInfo.txt");
        // Create a scanner object to read the file
        Scanner inputFile = new Scanner(sFile);

        // Read StudentInfo
        for(int student = 1; student <= 5; student++)
        {
            String name = inputFile.nextLine();
            gradeBook.setName(student, name);
            for (int test = 0; test < 4; test++)
            {
                grades[test] = inputFile.nextDouble();
            }
        }

    // Close the file
    inputFile.close();

    }

}

然后是成绩簿类

public class Gradebook {

    // Declare fields
    private final int NUM_STUDENTS = 5;
    private final int NUM_TESTS = 4;
    // ArrayList for names of students - 5 in total
    private String[] names = new String[NUM_STUDENTS];
    // Array to store letter grades
    private char[] grades;
    // array to store each student's scores
    private double[] scores1 = new double[NUM_TESTS];
    private double[] scores2 = new double[NUM_TESTS];
    private double[] scores3 = new double[NUM_TESTS];
    private double[] scores4 = new double[NUM_TESTS];
    private double[] scores5 = new double[NUM_TESTS];


    // Method to set student's name
    public void setName(int studentNumber, String name)
    {
        names[studentNumber-1] = name;
    }

    // Method sets student scores

    public void setScores(int studentNumber, double[] scores)
    {
    switch(studentNumber)
        {
            case 1:copyArray(scores1,scores); break;
            case 2:copyArray(scores2,scores); break;
            case 3:copyArray(scores3,scores); break;
            case 4:copyArray(scores4,scores); break;
            case 5:copyArray(scores5,scores); break;
            default:break;
        }
    }

    // Returns the student's name

    public String getName(int studentNumber)
    {
    return names[studentNumber-1];
    }

    // Returns student's average score

    public double getAverage(int studentNumber)
    {
    double avg=0.0;
    switch(studentNumber)
    {
        case 1:avg = calcAverage(scores1); break;
        case 2:avg = calcAverage(scores2); break;
        case 3:avg = calcAverage(scores3); break;
        case 4:avg = calcAverage(scores4); break;
        case 5:avg = calcAverage(scores5); break;
        default:break;
    }
    return avg;
    }

    // Returns the student's letter grade

    public char getLetterGrade(int studentNumber)
    {
    char lettergrade;
    if(getAverage(studentNumber)>=90 && getAverage(studentNumber)<=100)
            lettergrade = 'A';
    else if(getAverage(studentNumber)>=80 && getAverage(studentNumber)<=89)
        lettergrade = 'B';
    else if(getAverage(studentNumber)>=70 && getAverage(studentNumber)<=79)
        lettergrade = 'C';
    else if(getAverage(studentNumber)>=60 && getAverage(studentNumber)<=69)
        lettergrade = 'D';
    else
            lettergrade = 'F';
    return lettergrade;

    }

    // Calculates the student's average

    private double calcAverage(double[] scores)
    {
    double sum=0;
    for(int i=0; i<scores.length; i++)
            sum+=scores[i];
    return sum/scores.length;

    }

    // Determines student's letter grade based on average score

    public char LetterGrade(double average)
    {
    char lettergrade;
    if(average>=90 && average<=100)
        lettergrade = 'A';
    else if(average>=80 && average<=89)
        lettergrade = 'B';
    else if(average>=70 && average<=79)
        lettergrade = 'C';
    else if(average>=60 && average<=69)
        lettergrade = 'D';
    else
            lettergrade = 'F';
    return lettergrade;
    }

    // Array copy method
    private void copyArray(double[] to, double[] from)
    {
    System.arraycopy(from, 0, to, 0, from.length);
    }


}

这是程序正在读取的文件 - StudentInfo.txt:

Joanne Smith
98
89
100
76
Will Jones
67
89
91
88
Kerry McDonald
78
79
88
91
Sam Young
88
98
76
56
Jill Barnes
94
93
91
98

最佳答案

你会得到InputMismatchException

原因
字符串名称 = inputFile.nextLine();//读取当前行,扫描仪移动到下一行
成绩[测试] = inputFile.nextDouble();//读取下一个 double 值

您应该能够毫无问题地读取第一个学生的姓名和成绩。读取 76 后,扫描仪位置位于第 5 行末尾。它没有跳过第 5 行。

因此,当您尝试通过调用 nextLine() 读取下一个学生姓名时。你会看见 ””。扫描仪移动到第 6 行。

因此下次调用 nextDouble() 失败。

快速修复
使用 Double.parseDouble(inputFile.nextLine()); 读取此处的 double 值

关于Java - 并行数组上的 ArrayIndexOutOfBounds 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26271379/

相关文章:

java - 区分大小写的文件扩展名和存在检查

java - 反射类仅初始化一次

java - Gradle 无法解析 sikulixapi

java - 我应该删除我在 netbeans 中制作的项目的 dist 文件夹吗?

java - Android Spinner 上的 IndexOutOfBoundException

java - InputFilter 内的 IndexOutOfBoundsException

java - 在 JAVA 中将日期从字符串 "yyyyddmm hh:mm:ss"转换为字符串 "DD/MM/YYYY"

C++ STL 库 vector 二维数组不越界

java - 遍历列表时出现奇怪的 outOfBoundsException

java - 获取 ArrayIndexOutOfBoundsException 并且不确定为什么