这段代码应该从用户那里得到一个整数,然后完成程序。如果用户输入的号码无效,则会再次询问用户。
捕获异常后,它使用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()
将重置所有内容并忘记异常。我在询问用户输入新内容之前就把它放了。
如果我说错了,那么正确的方法是什么?
答案 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,该方法仅“重置”区域设置,基数和分隔符设置。它对已读取的数据没有任何作用。