扫描程序双精度值 - InputMismatchException

Scanner double value - InputMismatchException

提问人:catch23 提问时间:6/17/2013 最后编辑:Roman Ccatch23 更新时间:9/29/2017 访问量:43091

问:

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

法典:

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 引发,以指示检索到的令牌与
预期类型的模式不匹配,或者令牌超出预期类型的范围。

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

问题:

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

评论

0赞 Tdorno 6/17/2013
您提供的代码片段没有错,错误出在别处。
1赞 Andrea Ligios 6/17/2013
如果不指定 Locale,your 可能应该在 Locale 中.,
0赞 Viktor Mellgren 6/17/2013
@Tdorno取决于您使用的语言环境,也许您使用的是 US-locale

答:

47赞 Alexis C. 6/17/2013 #1

您应该为扫描仪精确设置一个区域设置。

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

文档

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

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

因此,您的默认区域设置当然使用 DecimalFormat,它期望逗号作为十进制分隔符而不是点。

评论

3赞 fge 6/17/2013
.useLocale()returns ,您可以将其缩短为thisnew Scanner(System.in).useLocale(Locale.US)
0赞 Prasad Kharkar 6/17/2013
我尝试运行这个程序,但没有遇到任何问题。我能知道这是为什么吗?
2赞 fge 6/17/2013
@PrasadKharkar可能是因为在 JVM 的默认语言环境中,十进制数字分隔符是点
1赞 fge 6/17/2013
@nazar_art导入正确的包; 在Localejava.util.Locale
0赞 fge 6/17/2013
您@nazar_art使用 Intellij IDEA 吗?导入应该是自动的......在最坏的情况下,它会询问您要导入的内容。
7赞 Viktor Mellgren 6/17/2013 #2

确保您使用的是正确的区域设置

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

也许您正在使用“,”是十进制分隔符的区域设置

评论

0赞 catch23 6/17/2013
是的,你是对的,当我尝试时一切都很好。我可以将其更改为任何 defalt 值吗?5,1
0赞 Viktor Mellgren 6/18/2013
我相信,如果你有 Windows,如果你去“区域和语言”,你可以将区域设置更改为你需要的任何区域设置。
0赞 catch23 6/19/2013
我是 Ubunta 12.04 的新用户(自 2 周以来)
1赞 Viktor Mellgren 6/19/2013
然后试试这个:blog.andrewbeacock.com/2007/01/......
1赞 Kalema Edgar 1/3/2021
当我遇到同样的情况时,语言环境就是问题 - stackoverflow.com/questions/65551133/......