这段代码应该从用户获得一个整数,然后完成程序.如果用户输入的号码无效,则会再次询问用户.
捕获异常后,它用于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]
}
}
Run Code Online (Sandbox Code Playgroud)
我以为Scanner.reset()会重置一切并忘记异常.我在询问用户输入新内容之前先说了一下.
如果我说错了,那么正确的方法是什么?
das*_*ght 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
}
Run Code Online (Sandbox Code Playgroud)
依赖异常来捕获异常情况是可以的,但是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;
Run Code Online (Sandbox Code Playgroud)