2016-05-08 6 views
0

いいえ。これは学期の最後のHW割り当てです。プログラムの大部分を除外しています。これは私が修正することができない唯一のものだからです。私はFileInputStreamをセットアップしており、forループを使用して、問題なく過去に行ったように配列に値を読み込みます。何らかの理由で私はこの例外を受け取り、それを理解できません。私はこの例外の周りにたくさんのスレッドを見てきましたが、同様に、それを理解できないようです。ハーフアップしてください。エラー:ファイルから配列に値を読み取ろうとするとNoSuchElementExceptionが発生する

ここはコードです。コンパイルされます。

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

public class CollinDunn_1_10 { 

    // Declare constants 
    static final int MAX_EMPLOY = 30; 
    static final String TAB = "\t"; 
    static final String NL = "\n"; 
    static final double IRA_INVEST = .08; 
    static final double FEDERAL_WITH = .18; 
    static final double STATE_WITH = .045; 
    static final double SAVINGS = .10; 

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

    // I/O String references 
    final String INPUT = "CollinDunn_1_10_Input.txt"; 
    final String OUTPUT = "CollinDunn_1_10_Output.txt"; 

    // Declare variables 
    // One-dimensional array for storing employee names 
    String [] names = new String [MAX_EMPLOY]; 

    // Two-dimensional array for storing employee pay data 
    // [0] hours worked [1] pay rate [2] gross pay [3] net pay 
    // [4] savings amount [5] IRA amount [6] taxs withheld 
    double [][] payInfo = new double [MAX_EMPLOY][6]; 

    // Set up I/O 
    FileInputStream inputDataFile = new FileInputStream(INPUT); 
    Scanner inputFile = new Scanner(inputDataFile);  
    FileWriter outputDataFile = new FileWriter(OUTPUT); 
    PrintWriter outputFile = new PrintWriter(outputDataFile); 

    // Read data from the file 
    readData(inputFile, payInfo, names); 

    // Test printing to see if values are stored - REMOVE 
    for (int i = 0; i < MAX_EMPLOY; i++) { 
    System.out.print(names[i] + TAB + payInfo[i][0] + TAB + payInfo[i][1]); 
    } 

} // End main 

// Method for reading file data into the file. 
// Data is sorted as (number of hours) (pay rate) (name) 
public static void readData (Scanner inputFile, double [][] payInfo, String [] names) { 
    for (int i = 0; i < MAX_EMPLOY; i++) { 
     payInfo [i][0] = inputFile.nextDouble(); 
     payInfo [i][1] = inputFile.nextDouble(); 
     names [i] = inputFile.nextLine(); 
    } // End For 
    return; 
} // End readData 
} // End Class 

*テキストファイルのフィールドはように、次のとおりです。 (時間)(有料)(名)

50.00 10.60ライトカレン・L
52.00 10.80フェイガンバート・トッド
62.00 12.24アントリムフォレストN *

The Exception and stack trace: 
Exception in thread "main" java.util.NoSuchElementException 

at java.util.Scanner.throwFor(Scanner.java:862) 

at java.util.Scanner.next(Scanner.java:1485) 

at java.util.Scanner.nextDouble(Scanner.java:2413) 

at CollinDunn_1_10.readData(CollinDunn_1_10.java:56) 

at CollinDunn_1_10.main(CollinDunn_1_10.java:42) 

答えて

1

検索する前に検索する値があるかどうかは決してチェックしません(Scanner.hasNextDoubleを参照)。 forループはMAX_EMPLOYの繰り返しを処理するため、この例外は、入力ファイルのデータ行の数がMAX_EMPLOY未満の場合に発生します。

+0

ありがとうございます。それはすべてをより明確にしました:) – EmergentSpecter

0

テーブルやファイルに適切な量の要素が含まれているかどうか、または十分に大きいかどうかを毎回確認する必要があります。コードは次のようになります。

「復帰」は必要ありません。このメソッドは何も返されないので、このメソッドの最後に。それは "空"の方法です。

+0

私は下の部分を取得し、各代入でhasNextを使用しますが、なぜこれを使用するのか分かりません(MAX_EMPLOY> payInfoLength || MAX_EMPLOY> namesLength)。すべてのフィールドが正しく入力されたときに名前とpayInfoが部分的に25に満たされていると見ると、MAX_EMPLOYは常に部分的に塗りつぶされた配列よりも大きくなります。 – EmergentSpecter

+0

テーブルを変更できません。彼らは一定のサイズを持っています。だから、それをチェックする方がいいです。どれくらいテーブルが埋まっているかは重要です。 あなたが他の人と働いている場合、あなたは何かについて100%確実性があるとは言えません。テーブルサイズを調べる前に、必ずテーブルサイズをチェックするのはいいです。この方法では、このテーブルのサイズがわからないので、別のエラーを作成しないようにチェックします。 – lukamate

関連する問題