InputMismatchExceptionが発生している理由が見つかりません

2020-02-15 java

テキスト文書から情報を取得し、それらを3つのdoubleに割り当てるプログラムを作成しているプログラムの1つの場所で立ち往生しています。しかし、「スレッド内の例外」main java.util.InputMismatchException」エラー(以下の完全なログ)を取得し続けます。これは通常、間違ったタイプの変数が入力されるように求められていることを意味しますが、なぜそうなるのかわかりませんそうです。

ログは次のとおりです。

Enter file name: Ellipsoid_data_1.txt
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
    at EllipsoidListApp.main(EllipsoidListApp.java:39)

これは3つのファイルのうちの1つだけですが、これが問題のある場所です。あなたが支援するためにできることはどれも素晴らしいことであり、必要に応じて他のファイルを提供することができます。

完全なプログラムは次のとおりです。

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;



/** 
*This class prints a list of Ellipsoids.
*Comp 1210 - project 5
*Steven Manings
*Version 2/14/2020
*/

public class EllipsoidListApp {

/**
 * Reads file with ellipsoid data, creates EllipsoidList, prints EllipsoidList,
 * prints summary of EllipsoidList.
 *
 * @param args - is not used.
 * @throws FileNotFoundException required by Scanner for File
 */ 

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

      ArrayList<Ellipsoid> tList = new ArrayList<Ellipsoid>();

      Scanner scan = new Scanner(System.in);
      System.out.print("Enter file name: ");
      String fileName = scan.nextLine();

      Scanner scanFile = new Scanner(new File(fileName));

      String ellipsoidListName = scanFile.nextLine();

      while (scanFile.hasNext()) {

         double a = scanFile.nextDouble();
         double b = scanFile.nextDouble();
         double c = scanFile.nextDouble();

         Ellipsoid t = new Ellipsoid(null, a , b, c);
         tList.add(t);           
      }


      scanFile.close();

      EllipsoidList myEList = new EllipsoidList(ellipsoidListName, tList);

      System.out.println(myEList);

      System.out.println(myEList.summaryInfo());


   }

}   

ここにデータファイルの内容を追加しました。

Ellipsoid Test List
Ex 1
1
2
3
 Ex 2   
2.3
5.5
7.4
Ex 3
123.4  
234.5
345.6

Answers

NomadMakerはコメントで正しいです。ファイルを開いた後、 scanFile.nextLine()呼び出してリスト名Ellipsoid Test Listを読み取ります。これで、スキャナーはラインEx 1配置されました。その後、ループに入ります。ループで最初に行うことは、 scanFile.nextDouble()呼び出すことです。スキャナーがEx配置され、 Exがdoubleの構文と一致しないため、報告したInputMismatchExceptionします。

解決策は、ループの最初でnextLine()もう一度呼び出して、 Ex 1 (そして次にEx 2など)を読み取ることだと思います。

これは、ここでは推測しているだけですが、 null代わりにEllipsoidコンストラクターの最初の引数として渡すものも提供します。

Related