Scanner.reset()不起作用

时间:2013-04-12 13:47:23

标签: java

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

捕获异常后,它使用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()将重置所有内容并忘记异常。我在询问用户输入新内容之前就把它放了。

如果我说错了,那么正确的方法是什么?

2 个答案:

答案 0 :(得分: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; 方法更好地解决同一问题,如下所示:

{{1}}

答案 1 :(得分:3)

Scanner.reset() javadoc,该方法仅“重置”区域设置,基数和分隔符设置。它对已读取的数据没有任何作用。