私は最も簡単な方法でスキャナーを使ってみました:
コード:
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 状態:
スキャナーによってスローされ、取得されたトークンが
予想されるタイプのパターン、またはトークンが予想されるタイプの範囲外であること。
しかし、私の心には、すべてが正しく見え、問題なく動作するはずです。
質問:
スキャナーのロケールを正確に指定する必要があります。
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
doc から:
このクラスのインスタンスは、標準形式およびスキャナーのロケールの形式で数値をスキャンできます。スキャナーの初期ロケールは、Locale.getDefault()メソッドによって返される値です。 useLocale(Java.util.Locale)メソッドで変更できます
ローカライズされたフォーマットは、特定のロケールについて、そのロケールのDecimalFormatオブジェクトdfとそのDecimalFormatSymbolsオブジェクトdfsから取得される次のパラメーターに関して定義されます。
したがって、デフォルトのロケールでは、ドットではなくコンマを小数点の区切り文字として使用するDecimalFormatを確実に使用します。
正しいロケールを使用していることを確認してください
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
多分あなたは "、"が小数点区切り文字であるロケールを使用している