2014-10-09 62 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