Двойное значение сканера - 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:

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

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

Вопросы:

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

2 ответа

Решение

Вы должны указать локаль для вашего сканера.

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

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

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

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

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

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

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

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

Другие вопросы по тегам