提问人:Yashmerino 提问时间:9/11/2021 最后编辑:ZabuzardYashmerino 更新时间:9/12/2021 访问量:338
Scanner#nextDouble 无法解析 5.2 (InputMismatchException) [duplicate]
Scanner#nextDouble fails to parse 5.2 (InputMismatchException) [duplicate]
问:
问题
我今天在玩 Java 时遇到了一些我自己无法修复的东西。我正在尝试从扫描仪获取双精度值,但总是收到此错误:
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
at Main.main(Main.java:20)
源代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
final char ADD = '+';
final char SUBTRACT = '-';
final char MULTIPLY = '*';
final char DIVIDE = '/';
double num1;
double num2;
char operator;
Scanner sc = new Scanner(System.in);
num1 = sc.nextDouble();
num2 = sc.nextDouble();
operator = sc.next().charAt(0);
System.out.print(num1 + " " + operator + " " + num2 + " = ");
switch (operator) {
case ADD:
System.out.print(num1 + num2);
break;
case SUBTRACT:
System.out.print(num1 - num2);
break;
case MULTIPLY:
System.out.print(num1 * num2);
break;
case DIVIDE:
System.out.print(num1 / num2);
break;
default:
System.out.println("Error");
break;
}
}
}
我的意见:
5.2
然后抛出异常。
我还有一个小视频来说明这个问题:https://streamable.com/wes4g1
最小示例
我什至能够通过非常小的设置重现该问题,例如:
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double value = scanner.nextDouble();
System.out.println(value);
}
}
使用输入或任何其他小数。5.2
但是,例如,输入实际的整数值就可以了。5
答:
1赞
Yashmerino
9/11/2021
#1
我所要做的就是使用逗号而不是点,“5,2”而不是“5.2”。 非常感谢@Zabuzard。他指出了解决方案。
2赞
Zabuzard
9/11/2021
#2
扫描仪和区域设置
从 Scanner#nextDouble
的 Javadoc 中看不出来,但它对语言环境敏感。
有多种因素会影响数字和文本的预期方式,这取决于您当前的集合。Scanner
Locale
默认情况下,使用您当前的系统区域设置(国家/地区和语言设置)。因此,您必须按照当前地区通常的书写方式输入数字。Scanner
小数分隔符。与
在您的特定情况下,它是您用 (dot) 输入的小数分隔符,但需要 (逗号)。例如,摩尔多瓦语言环境就是这种情况,因为在摩尔多瓦语中,使用逗号代替。.
Scanner
,
因此,当您输入它时,它没有看到任何 ,如您当前的 .但是当你进入时,它起作用了。5.2
double
Locale
5,2
您可以在 的 Javadoc 中阅读更多相关信息,请参阅本地化数字部分。另请参阅维基百科中的此插图:Scanner
更改区域设置
也就是说,您可以使用来更改区域设置用途。例如:Scanner#useLocale
Scanner
scanner.useLocale(Locale.ENGLISH);
然后你也可以作为输入使用。5.2
评论
num1 = sc.nextDouble();
5,2