7

这段代码应该从用户那里得到一个整数,然后完成程序。如果用户输入了一个无效的号码,它会再次询问用户。

捕获异常后,它用于Scanner.reset()重置扫描仪,但它不起作用。它会重新抛出以前的异常。

Scanner in = new Scanner(System.in);
while (true) {
    try {
        System.out.print("Enter an integer number: ");
        long i = in.nextLong();
        System.out.print("Thanks, you entered: ");
        System.out.println(i);
        break;
    } catch (InputMismatchException ex) {
        System.out.println("Error in your input");
        in.reset(); // <----------------------------- [The reset is here]
    }
}

我以为Scanner.reset()会重置一切并忘记异常。我在向用户询问新输入之前将其放入。

如果我理解错误,那么正确的方法是什么?

4

2 回答 2

11

您误解了该reset方法的目的:它用于重置与扫描仪关联的“元数据”——它的空格、分隔符等。它不会改变其输入的状态,所以它不会达到你正在寻找的东西。

你需要的是一个调用next(),它读取并丢弃任何String来自Scanner

try {
    System.out.print("Enter an integer number: ");
    long i = in.nextLong();
    System.out.print("Thanks, you entered: ");
    System.out.println(i);
    break;
} catch (InputMismatchException ex) {
    System.out.println("Error in your input");
    in.next(); // Read and discard whatever string the user has entered
}

依靠异常来捕获异常情况是可以的,但解决同一问题的更好方法是has...在调用方法之前使用next...方法,如下所示:

System.out.print("Enter an integer number: ");
if (!in.hasNextLong()) {
    in.next();
    continue;
}
long i = in.nextLong();
System.out.print("Thanks, you entered: ");
System.out.println(i);
break;
于 2013-04-12T13:51:02.853 回答
3

根据Scanner.reset() javadoc,该方法仅“重置”语言环境、基数和分隔符设置。它不会对它已经读取的数据做任何事情。

于 2013-04-12T13:51:02.077 回答