web-dev-qa-db-ja.com

スキャナーの二重値-InputMismatchException

私は最も簡単な方法でスキャナーを使ってみました:

コード:

double gas, efficiency, distance, cost;
Scanner scanner = new Scanner(System.in);

System.out.print("Enter the number of gallons of gas in the tank: ");
gas = scanner.nextDouble();
System.out.print("Enter the fuel efficiency: ");
efficiency = scanner.nextDouble();

しかし、最初の入力後5.1スローします:

Exception in thread "main" Java.util.InputMismatchException
    at Java.util.Scanner.throwFor(Scanner.Java:909)
    at Java.util.Scanner.next(Scanner.Java:1530)
    at Java.util.Scanner.nextDouble(Scanner.Java:2456)
    at udacity.MileagePrinter.main(MileagePrinter.Java:59)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:120)

JavaDocs 状態:

スキャナーによってスローされ、取得されたトークンが
予想されるタイプのパターン、またはトークンが予想されるタイプの範囲外であること。

しかし、私の心には、すべてが正しく見え、問題なく動作するはずです。

質問:

  • なぜこれがこの状況で起こるのですか?
  • この問題を回避する方法は?
22
nazar_art

スキャナーのロケールを正確に指定する必要があります。

Scanner scanner = new Scanner(System.in).useLocale(Locale.US);

doc から:

このクラスのインスタンスは、標準形式およびスキャナーのロケールの形式で数値をスキャンできます。スキャナーの初期ロケールは、Locale.getDefault()メソッドによって返される値です。 useLocale(Java.util.Locale)メソッドで変更できます

ローカライズされたフォーマットは、特定のロケールについて、そのロケールのDecimalFormatオブジェクトdfとそのDecimalFormatSymbolsオブジェクトdfsから取得される次のパラメーターに関して定義されます。

したがって、デフォルトのロケールでは、ドットではなくコンマを小数点の区切り文字として使用するDecimalFormatを確実に使用します。

31
Alexis C.

正しいロケールを使用していることを確認してください

Scanner scanner = new Scanner(System.in).useLocale(Locale.US);

多分あなたは "、"が小数点区切り文字であるロケールを使用している

6
Viktor Mellgren