Двойное значение сканера - 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);
Может быть, вы используете локаль, где "," является десятичным разделителем