Scanner#nextDouble 无法解析 5.2(InputMismatchException)
Scanner#nextDouble fails to parse 5.2 (InputMismatchException)
问题
我今天在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
是可行的。
我所要做的就是使用逗号而不是点,“5,2”而不是“5.2”。
非常感谢@Zabuzard。他指出了解决方案。
扫描仪和语言环境
从 Scanner#nextDouble
的 Javadoc 中看不出来,但是 Locale-sensitive.
有多种因素会影响 Scanner
期望数字和文本的显示方式,具体取决于您当前的设置 Locale
。
默认情况下,Scanner
使用您当前的系统区域设置(国家和语言设置)。所以您必须按照您所在地区通常的书写方式输入数字。
小数点分隔符。对比,
在您的特定情况下,它是您使用 .
(点)输入的 小数分隔符,但 Scanner
需要 ,
(逗号)代替。例如,摩尔多瓦语言环境就是这种情况,因为在摩尔多瓦中使用逗号代替。
因此,当您输入 5.2
时,它没有 看到 任何 double
,正如您当前的 Locale
所指定的那样。但是当你输入5,2
时,它就起作用了。
您可以在 Scanner
的 Javadoc 的 本地化数字 部分阅读更多相关信息。另请参阅 Wikipedia 中的插图:
更改语言环境
也就是说,您可以使用 Scanner#useLocale
来更改 Scanner
使用的语言环境。例如:
scanner.useLocale(Locale.ENGLISH);
然后您还可以使用 5.2
作为输入。
问题
我今天在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
是可行的。
我所要做的就是使用逗号而不是点,“5,2”而不是“5.2”。 非常感谢@Zabuzard。他指出了解决方案。
扫描仪和语言环境
从 Scanner#nextDouble
的 Javadoc 中看不出来,但是 Locale-sensitive.
有多种因素会影响 Scanner
期望数字和文本的显示方式,具体取决于您当前的设置 Locale
。
默认情况下,Scanner
使用您当前的系统区域设置(国家和语言设置)。所以您必须按照您所在地区通常的书写方式输入数字。
小数点分隔符。对比,
在您的特定情况下,它是您使用 .
(点)输入的 小数分隔符,但 Scanner
需要 ,
(逗号)代替。例如,摩尔多瓦语言环境就是这种情况,因为在摩尔多瓦中使用逗号代替。
因此,当您输入 5.2
时,它没有 看到 任何 double
,正如您当前的 Locale
所指定的那样。但是当你输入5,2
时,它就起作用了。
您可以在 Scanner
的 Javadoc 的 本地化数字 部分阅读更多相关信息。另请参阅 Wikipedia 中的插图:
更改语言环境
也就是说,您可以使用 Scanner#useLocale
来更改 Scanner
使用的语言环境。例如:
scanner.useLocale(Locale.ENGLISH);
然后您还可以使用 5.2
作为输入。