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 作为输入。