web-dev-qa-db-fra.com

Scanner double value - InputMismatchException

J'ai essayé d'utiliser le scanner de la manière la plus simple:

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

Mais après la première entrée 5.1 il jette:

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)

L'état JavaDocs :

Lancé par un scanner pour indiquer que le jeton récupéré ne correspond pas au
modèle pour le type attendu, ou que le jeton est hors de portée pour le type attendu.

Mais à mon avis, tout semble correct et devrait fonctionner correctement.

Questions:

  • Pourquoi cela se produit-il dans cette situation?
  • Comment contourner ce problème?
22
nazar_art

Vous devez spécifier un paramètre régional pour votre scanner.

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

De la doc :

Une instance de cette classe est capable de numériser des nombres dans les formats standard ainsi que dans les formats des paramètres régionaux du scanner. Les paramètres régionaux initiaux d'un scanner sont la valeur renvoyée par la méthode Locale.getDefault (); il peut être modifié via la méthode useLocale (Java.util.Locale)

Les formats localisés sont définis en fonction des paramètres suivants, qui pour une locale particulière sont tirés de l'objet DecimalFormat de cette locale, df, et de son objet DecimalFormatSymbols, dfs.

Ainsi, vos paramètres régionaux par défaut utilisent certainement un DecimalFormat qui attend une virgule comme délimiteur décimal au lieu d'un point.

31
Alexis C.

Assurez-vous que vous utilisez les paramètres régionaux corrects

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

Vous utilisez peut-être un paramètre régional où "," est le délimiteur décimal

6
Viktor Mellgren