【发布时间】:2014-01-09 00:54:39
【问题描述】:
我试图编写一种方法,使人们能够通过 Scanner 输入整数,而不会因异常而导致程序崩溃。这是我最初拥有的:(这里,sc 是一个 Scanner 对象)
public static int inputInt(String message) {
int returnval = 0;
System.out.println(message);
try {
returnval = sc.nextInt();
} catch (Exception ex) {
System.out.println("You must enter an integer.");
inputInt(message);
}
return returnval;
}
当我使用无效输入测试程序时,启动了一个无限循环,消息和“您必须输入一个整数”被打印了很多次,然后被 Eclipse 停止。 我使用以下代码解决了这个问题:
public static int inputInt(String message) {
int returnval = 0;
System.out.println(message);
String valstring = sc.nextLine();
try {
returnval = Integer.parseInt(valstring);
} catch (Exception ex) {
System.out.println("You must enter an integer.");
inputInt(message);
}
return returnval;
}
为什么第一种方法失败,而第二种方法失败?是否有更清洁的方法来实现这一点?
【问题讨论】:
-
基本原因是这样的:如果你告诉扫描器寻找一个整数,它看到一个不属于整数的字符,它会抛出一个异常,但那个字符仍然存在在输入。在要求它重试之前,您必须做一些事情来强制扫描仪跳过它。
sc.nextLine()(请参阅 Snow 的 Doorknob 的回答)将完成这项工作。 -
请注意,如果您使用
nextInt(),输入中会留下一个换行符。 -
@RafaEl 真的。但还要注意,如果下一个
nextInt()看到换行符,它将跳过它,因为nextInt()会查看标记,而换行符等空白字符(默认情况下)不是标记的一部分。
标签: java recursion infinite-loop