Scanner#nextDouble 无法解析 5.2 (InputMismatchException) [duplicate]

Scanner#nextDouble fails to parse 5.2 (InputMismatchException) [duplicate]

提问人:Yashmerino 提问时间:9/11/2021 最后编辑:ZabuzardYashmerino 更新时间:9/12/2021 访问量:338

问:

问题

我今天在玩 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

Java 解析 java.util.scanner inputMismatchException

评论

0赞 Mureinik 9/11/2021
这是你的全部投入吗?您的代码尝试从 stdin 读取两个双精度
0赞 Yashmerino 9/11/2021
@Mureinik是的,这是整个输入,我键入 5.2 并引发异常。
0赞 tmarwen 9/11/2021
这不可能是导致错误的输入,因为根据语句,这将完全有效。您是否正在执行任何其他击键?num1 = sc.nextDouble();
0赞 Yashmerino 9/11/2021
可能是我的eclipse ide或某种问题吗?除了这个,我不会输入任何其他内容。另外,如果我输入一个 int 数字,例如 5,那么一切正常
1赞 Zabuzard 9/11/2021
您的机器上设置了什么系统语言?对于像德国这样的国家/地区,您必须输入逗号,例如。尝试以当前计算机国家/地区/语言设置(区域设置)所期望的方式输入它。如果这是问题所在,而您不希望这样,您可以轻松更改 Java 使用的语言环境。5,2

答:

1赞 Yashmerino 9/11/2021 #1

我所要做的就是使用逗号而不是点,“5,2”而不是“5.2”。 非常感谢@Zabuzard。他指出了解决方案。

2赞 Zabuzard 9/11/2021 #2

扫描仪和区域设置

Scanner#nextDouble 的 Javadoc 中看不出来,但它对语言环境敏感

有多种因素会影响数字和文本的预期方式,这取决于您当前的集合。ScannerLocale

默认情况下,使用您当前的系统区域设置(国家/地区和语言设置)。因此,您必须按照当前地区通常的书写方式输入数字。Scanner

小数分隔符。与

在您的特定情况下,它是您用 (dot) 输入的小数分隔符,但需要 (逗号)。例如,摩尔多瓦语言环境就是这种情况,因为在摩尔多瓦语中,使用逗号代替。.Scanner,

因此,当您输入它时,它没有看到任何 ,如您当前的 .但是当你进入时,它起作用了。5.2doubleLocale5,2

您可以在 的 Javadoc 中阅读更多相关信息,请参阅本地化数字部分。另请参阅维基百科中的此插图:Scanner

Countries using decimal comma

更改区域设置

也就是说,您可以使用来更改区域设置用途。例如:Scanner#useLocaleScanner

scanner.useLocale(Locale.ENGLISH);

然后你也可以作为输入使用。5.2