为什么会出现InputMismatchException异常?

10

到目前为止,我有这个:

public double checkValueWithin(int min, int max) {
    double num;
    Scanner reader = new Scanner(System.in);
    num = reader.nextDouble();                         
    while (num < min || num > max) {                 
        System.out.print("Invalid. Re-enter number: "); 
        num = reader.nextDouble();                         
    }
    return num;
}

和这个:

public void askForMarks() {
    double marks[] = new double[student];
    int index = 0;
    Scanner reader = new Scanner(System.in);
    while (index < student) {
        System.out.print("Please enter a mark (0..30): ");
        marks[index] = (double) checkValueWithin(0, 30); 
        index++;
    }
}

测试时无法接受双倍数,收到以下消息:

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 MarkingSystem.checkValueWithin(MarkingSystem.java:25)
at MarkingSystem.askForMarks(MarkingSystem.java:44)
at World.main(World.java:6)
Java Result: 1

我该如何解决这个问题?


看这个:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/InputMismatchException.html。也许扫描器无法解析您在控制台中输入的内容?例如,它要求输入一个数字,而您输入了“hello”? - Name
试着使用 "nextFloat"。 - Name
从 askForMarks() 中移除 Scanner reader = new Scanner(System.in);,一切都可以正常工作。 - Joe
5个回答

11

与其使用点号,如:1.2,请尝试像这样输入:1,2。


3
尝试更改扫描器的本地化语言:.useLocale(Locale.ENGLISH) - HoseinGhanbari

9

在这里,您可以了解到Scanner的特性:

double nextDouble()

将下一个标记作为双精度浮点数返回。如果下一个标记不是浮点数或超出范围,则会抛出InputMismatchException异常。

尝试捕获异常

try {
    // ...
} catch (InputMismatchException e) {
    System.out.print(e.getMessage()); //try to find out specific reason.
}

更新

情况1

我尝试了您的代码,没有任何问题。您之所以会收到该错误,是因为您必须输入String。当我输入数字时,它可以正常运行而没有任何错误。但是一旦我输入String,它就会抛出与您在问题中提到的相同的异常

情况2

您输入了一些超出范围的内容,如我上面所述。

我真的很想知道您尝试输入了什么。在我的系统中,它可以完美地运行,而不需要更改任何一行代码。只需按原样复制并尝试编译和运行即可。

import java.util.*;

public class Test {
    public static void main(String... args) {
        new Test().askForMarks(5);
    }

    public void askForMarks(int student) {
        double marks[] = new double[student];
        int index = 0;
        Scanner reader = new Scanner(System.in);
        while (index < student) {
            System.out.print("Please enter a mark (0..30): ");
            marks[index] = (double) checkValueWithin(0, 30); 
            index++;
        }
    }

    public double checkValueWithin(int min, int max) {
        double num;
        Scanner reader = new Scanner(System.in);
        num = reader.nextDouble();                         
        while (num < min || num > max) {                 
            System.out.print("Invalid. Re-enter number: "); 
            num = reader.nextDouble();                         
        } 

        return num;
    }
}

正如您所说,您尝试输入 1.0, 2.8 等。请尝试使用此代码。

注意:请逐行输入数字,每个数字单独一行。也就是说,输入 2.7,按回车键,然后输入第二个数字(例如 6.7)。


就像我说的那样,我只输入双精度值,例如1.0、5.8等,但仍然显示相同的消息。 - Trần Trung
@TrầnTrung 复制整个代码并编译运行它。同时,尝试输入一些你之前尝试过的内容。另外,请查看我的答案末尾的注意事项。如果你解决了问题,请告诉我。 - Ravi
1
我认为我找到了问题所在,因为我的电脑只将“,”识别为小数部分,而我使用的输入是“。”,这就是为什么它无法工作的原因。 - Trần Trung

3

由于您有手动用户输入循环,扫描仪读取第一个输入后,会将回车/换行符传递到下一行,然后继续读取;当然,这不是您想要的。

您可以尝试使用以下方法:

try {
    // ...
} catch (InputMismatchException e) {
    reader.next(); 
}

或者,您可以通过调用

reader.next()

在读取下一个双精度输入之前消耗掉回车符。


3

我遇到了同样的问题。奇怪的是,原因在于Scanner对象解释分数取决于系统的本地化设置。如果当前的本地化使用逗号来分隔分数的部分,那么带有点的分数将会变成字符串类型。因此出现了错误...


0
你是否向控制台提供了写入输入?
Scanner reader = new Scanner(System.in);
num = reader.nextDouble();  

如果您只输入数字,它将返回双倍。但是,如果您输入字符串或字符,则在尝试执行 num = reader.nextDouble() 时会抛出 java.util.InputMismatchException 异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接