Java-并行数组上的ArrayIndexOutOfBounds错误

Java-并行数组上的ArrayIndexOutOfBounds错误,java,indexoutofboundsexception,Java,Indexoutofboundsexception,我在这个项目上遇到了一些麻烦: 我们得到了一个由5名学生组成的文本文件,每个学生的名字后面有4个数字等级,在单独的一行中。我们必须使用main方法读取文件,然后在成绩册类中执行计算。然而,从课堂上其他人所说的,我们使用的方法最多是过时的,涉及并行数组。但我们似乎没有其他选择,所以我会尽我所能。但在我希望代码快结束的时候,我遇到了一个问题,它说包含学生成绩的索引超出了范围 在main中,我以许多不同的方式重写了readFile方法,但不管怎样,我仍然会遇到这些错误。有人能帮我理解发生了什么事吗?我

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

我们得到了一个由5名学生组成的文本文件,每个学生的名字后面有4个数字等级,在单独的一行中。我们必须使用main方法读取文件,然后在成绩册类中执行计算。然而,从课堂上其他人所说的,我们使用的方法最多是过时的,涉及并行数组。但我们似乎没有其他选择,所以我会尽我所能。但在我希望代码快结束的时候,我遇到了一个问题,它说包含学生成绩的索引超出了范围

在main中,我以许多不同的方式重写了readFile方法,但不管怎样,我仍然会遇到这些错误。有人能帮我理解发生了什么事吗?我会尽我所能发布所有信息。 如果我在这方面有点慢/没有能力,我也很抱歉,不幸的是,这是我几个月来第一次编写java代码

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

以下是我的主要方法:

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();

    }

}

这是一个相当有趣的“这不可能发生”的场景。 从注释中,我猜实际编译的代码在内部for循环中有一个错误。您需要找到实际编译的文件

尝试添加随机数

System.out.println("Got HERE!");
查看是否有任何代码被打印出来。
因为您显示的代码不应该能够给出该异常。

您将得到InputMissmatchException

原因
字符串名称=inputFile.nextLine()//读取当前行,扫描仪移动到下一行
等级[测试]=inputFile.nextDouble()//读取下一个双精度值

你应该能够阅读第一个学生的名字和成绩没有任何问题。读取76后,扫描仪位置位于第5行的末尾。它没有跳过第5行

所以,当您试图通过调用nextLine()读取下一个学生的名字时。您将看到“”。扫描仪移到第6行

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

快速修复

使用Double.parseDouble(inputFile.nextLine())阅读这里的双值

我已经尝试过了,它对我来说毫无问题。尝试清理和重建你的项目。这很奇怪,它仍然会给我同样的错误。我可能会尝试另一个编译器。可能你的文件数据不正确,因为异常发生在
readFile()
@Alzecha,哪一行是
GradeBookDemo
@DanielBarbarian中的第64行。我也这么做了:)也很抱歉:)非常感谢你的帮助,很抱歉我的回答被耽搁了,我不得不暂时休息一下。我试图插入它来代替grades[test]=inputfile.nextDouble();,但这样说给了我另一个错配错误。在那之后,我试着把分数[test]=放在前面,但那不会编译。我不确定我是否只是误读了应该把它放在哪里,或者我是否仍然有错误。我会继续尝试,认为你应该能够运行它后,改变到这个。grades[test]=Double.parseDouble(inputFile.nextLine());请在此更新异常跟踪。谢谢回复。奇怪的是,我这样做了,但没有一个是印刷品。我再次遇到不匹配异常,既使用了我的原始代码,也尝试了Suresh在上面的评论中所说的。这真的开始让我困惑,为什么早期代码中的部分无法打印文本…@Alzecha这个问题的答案很简单,编译器看到的文件不是您正在编辑的文件。考虑到你的行为改变是随机的,你可能正在编译另一个文件。
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);
    }


}
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
System.out.println("Got HERE!");