簡體   English   中英

錯誤:嘗試從文件到數組讀取值時出現NoSuchElementException

[英]Error: NoSuchElementException when trying to read values from file to array

好的。 因此,這是該學期的最后一次硬件作業,我在程序中忽略了很大一部分,因為這是我似乎無法解決的唯一問題。 我正在設置FileInputStream並使用for循環將值讀入數組,就像我過去所做的一樣,沒有任何問題。 由於某種原因,我遇到了這個異常,無法解決。 我已經研究了圍繞此異常的許多其他線程,但同樣,似乎也無法弄清楚。 請暫停。

這是代碼,它可以編譯;

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輕卡倫
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)

在嘗試檢索值之前,您永遠不會檢查是否有要檢索的值(查找Scanner.hasNextDouble)。 由於您的for循環經過MAX_EMPLOY迭代,因此只要您的輸入文件包含少於MAX_EMPLOY行的數據,就會發生此異常。

您應該每次檢查表或文件中是否包含正確數量的元素,或者它們是否足夠大。 代碼應如下所示:

public static void readData (Scanner inputFile, double [][] payInfo, String [] names) {
     Integer payInfoLenght = payInfo.lenght;
     Integer namesLenght = names.lenght;
     if (MAX_EMPLOY > payInfoLenght || MAX_EMPLOY > namesLenght) {
          System.out.println("Wrong size of tabels");
     } else {
          for (int i = 0; i < MAX_EMPLOY; i++) {
             if (inputFile.hasNextDouble()) {
                 payInfo [i][0] = inputFile.nextDouble();
             }
             if (inputFile.hasNextDouble()) {
                 payInfo [i][1] = inputFile.nextDouble();
             }
             if (inputFile.hasNextLine()) {
                 names [i] = inputFile.nextLine();
             }
          } 
     }
} 

而且您不需要“返回”; 在此方法的末尾,因為此方法沒有任何回報。 這是“無效”的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM