28

我尝试以最简单的方式使用扫描仪:

代码:

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状态:

由 Scanner 抛出以指示检索到的令牌与预期类型的​​模式不匹配
,或者令牌超出预期类型的​​范围。

但在我看来,一切看起来都正确,应该可以正常工作。

问题:

  • 为什么会在这种情况下发生?
  • 如何规避这个麻烦?
4

2 回答 2

42

您应该为您的扫描仪精确设置语言环境。

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

文档

此类的一个实例能够扫描标准格式以及扫描仪区域设置格式的数字。扫描仪的初始语言环境是 Locale.getDefault() 方法返回的值;可以通过 useLocale(java.util.Locale) 方法更改

本地化格式根据以下参数定义,对于特定语言环境,这些参数取自该语言环境的 DecimalFormat 对象 df 及其和 DecimalFormatSymbols 对象 dfs。

因此,您的默认语言环境肯定使用 DecimalFormat,它期望逗号作为小数分隔符而不是点。

于 2013-06-17T14:59:56.040 回答
7

确保您使用正确的语言环境

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

也许您正在使用“,”是十进制分隔符的语言环境

于 2013-06-17T15:03:23.133 回答