2014-10-09 42 views
1

我有一点麻烦这个项目时出现错误。我们必须使用我们的主要方法来读取文件,然后在gradebook类中执行计算。然而,从课堂上其他人的观点来看,我们使用的方法最好是古老的,涉及并行数组。我们似乎没有其他选择,所以我尽我所能做到了。但接近我所希望的是这段代码的结束,我遇到了一个问题,它说包含学生成绩的索引超出了范围。的ArrayIndexOutOfBounds Java的并行阵列

我已经用很多不同的方式重写了我的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 
+0

我已经试过了,它对我没有任何问题。尝试清理并重建您的项目。 – Jens 2014-10-09 06:14:02

+0

这很奇怪,它仍然给我同样的错误。也许我会尝试使用不同的编译器。 – Alzecha 2014-10-09 06:23:44

+0

也许你的文件数据不正确,因为'readFile()'发生异常' – Yazan 2014-10-09 06:25:31

回答

0

这是一个相当有趣的“这不可能发生“场景。 从评论我会猜测实际编译的代码在内部的for循环有一个错误。你需要找到你正在编译的文件。

尝试添加随机

System.out.println("Got HERE!"); 

你的代码,看看其中是否实际打印。 因为您显示的代码不应该能够给出该例外。

+0

感谢您的回复。奇怪的是,我做到了这一点,他们都没有打印。我再次遇到了不匹配的异常,都使用了我的原始代码,并试图在上述评论中叙述Suresh所说的内容。它真的开始混淆我为什么甚至更早的代码的部分不能打印文本... – Alzecha 2014-10-09 22:47:57

+0

@Alzecha这个问题的答案很简单,编译器看到的文件不是你正在编辑的文件。考虑到你随机得到了行为变化,你可能正在编译一个elses文件。 – 2014-10-10 06:35:48

1

你会得到InputMismatchException时

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

您应该可以读取第一个学生的姓名和成绩,而不会有任何问题。读取76后,扫描仪位置在第5行的末尾。它没有跳过第5行。

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

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

快速修复
使用Double.parseDouble(INPUTFILE。nextLine());用于读取这里的双精度值

+0

非常感谢您的帮助,对于我的回答迟到抱歉,我不得不休息一下。我试图插入,而不是成绩[测试] = inputfile.nextDouble();,但把它这样给了我另一个不匹配的错误。之后,我试着把分数[测试] =放在它之前,但不能编译。我不确定我是否误解了我应该放哪,或者我是否还有错误。我会继续尝试,虽然 – Alzecha 2014-10-09 22:44:55

+0

你应该能够在改变这个之后运行它。等级[test] = Double.parseDouble(inputFile.nextLine());请在这里更新异常跟踪。 – 2014-10-13 06:02:48