Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scanner double value - InputMismatchException

I tried use scanner at easiest way:

Code:

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(); 

But after first input 5.1 it throws:

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) 

The JavaDocs state:

Thrown by a Scanner to indicate that the token retrieved does not match the
pattern for the expected type, or that the token is out of range for the expected type.

But to my mind all look correctly, and should work OK.

Questions:

  • Why this happen at this situation?
  • How to circumvent this trouble?
like image 657
catch23 Avatar asked Jun 17 '13 14:06

catch23


People also ask

What does nextDouble mean?

The nextDouble() is a method of Java Scanner class which is used to scan the next token of the input as a double. If the translation is successful, the scanner past the input that matched.

What is the InputMismatchException in Java?

p>The InputMismatchException is a runtime exception in Java that is thrown by a Scanner object to indicate that a retrieved token does not match the pattern for the expected type, or that the token is out of range for the expected type.

What does scan nextDouble do?

The nextDouble() method of java. util. Scanner class scans the next token of the input as a Double. If the translation is successful, the scanner advances past the input that matched.


2 Answers

You should precise a Locale for your Scanner.

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

From the doc :

An instance of this class is capable of scanning numbers in the standard formats as well as in the formats of the scanner's locale. A scanner's initial locale is the value returned by the Locale.getDefault() method; it may be changed via the useLocale(java.util.Locale) method

The localized formats are defined in terms of the following parameters, which for a particular locale are taken from that locale's DecimalFormat object, df, and its and DecimalFormatSymbols object, dfs.

So your default locale use certainly a DecimalFormat that expect a comma as a decimal delimiter instead of a dot.

like image 75
Alexis C. Avatar answered Sep 23 '22 17:09

Alexis C.


Make sure that you are using the correct locale

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

Maybe you are using a locale where "," is the decimal delimiter

like image 42
Viktor Mellgren Avatar answered Sep 23 '22 17:09

Viktor Mellgren