9

到目前为止,我有这个:

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

我该如何解决?

4

5 回答 5

11

不要使用点,例如:1.2,而是尝试像这样输入:1,2。

于 2014-09-24T15:24:37.157 回答
9

在这里您可以看到Scanner的性质:

双下一个双()

以双精度形式返回下一个标记。如果下一个标记不是浮点数或超出范围,则抛出 InputMismatchException。

尝试捕捉异常

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

更新

情况1

我试过你的代码,没有任何问题。您收到该错误是因为您必须输入Stringvalue。当我输入一个数值时,它运行没有任何错误。但是,一旦我输入String了您在问题中提到 throw的相同内容。Exception

案例二

您输入的内容超出了我上面提到的范围。

我真的很想知道你可以尝试输入什么。在我的系统中,它运行完美,无需更改任何一行代码。只需照原样复制并尝试编译并运行它。

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.02.8。请尝试使用此代码。

注意:请在不同的行中逐行输入数字。我的意思是,回车2.7,按回车,然后输入第二个数字(例如6.7)。

于 2012-12-25T04:04:44.393 回答
3

我遇到了同样的问题。奇怪,但原因是对象扫描器根据系统的本地化解释分数。如果当前本地化使用逗号分隔分数的各个部分,则带有点的分数将变成字符串类型。因此错误...

于 2014-03-19T17:46:09.013 回答
2

由于您有手动用户输入循环,因此在扫描仪读取您的第一个输入后,它会将回车/回车传递到下一行,该行也将被读取;当然,这不是你想要的。

你可以试试这个

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

或者,您可以在读取下一个双重输入之前使用该回车符,方法是调用

reader.next()

于 2012-12-25T04:04:07.810 回答
0

您是否向控制台提供写入输入?

Scanner reader = new Scanner(System.in);
num = reader.nextDouble();  

如果您只输入 456 之类的数字,则返回双精度。如果您输入的是字符串或字符,它会在尝试执行 num = reader.nextDouble() 时抛出 java.util.InputMismatchException。

于 2012-12-25T04:06:36.737 回答