Вопрос-ответ

Scanner double value - InputMismatchException

Двойное значение сканера - исключение InputMismatchException

Я попробовал использовать scanner самым простым способом:

Код:

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:


Выдается сканером для указания того, что полученный токен не соответствует
шаблону для ожидаемого типа или что токен находится вне диапазона для ожидаемого типа.


Но, на мой взгляд, все выглядит правильно и должно работать нормально.

Вопросы:


  • Почему это происходит в данной ситуации?

  • Как обойти эту проблему?

Переведено автоматически
Ответ 1

Вам следует уточнить локаль для вашего сканера.

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

Из документа :


Экземпляр этого класса способен сканировать числа в стандартных форматах, а также в форматах локали сканера. Начальная локаль сканера - это значение, возвращаемое методом Locale.getDefault(); оно может быть изменено с помощью метода useLocale(java.util.Locale)

Локализованные форматы определяются в терминах следующих параметров, которые для конкретной локали берутся из объекта DecimalFormat этой локали, df, и его объекта DecimalFormatSymbols, dfs.


Таким образом, в вашем языковом стандарте по умолчанию, безусловно, используется DecimalFormat, который ожидает запятую в качестве десятичного разделителя вместо точки.

Ответ 2

Убедитесь, что вы используете правильный языковой стандарт

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

Возможно, вы используете языковой стандарт, где "," является десятичным разделителем

java