Подтвердить что ты не робот

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

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

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

Вопросы:

  • Почему это происходит в этой ситуации?
  • Как обойти эту проблему?
4b9b3361

Ответ 1

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

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

Из doc:

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

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

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

Ответ 2

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

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

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