![](/img/trans.png)
[英]Alternative for an infinite loop in java while using scanner.hasNext() with scanner argument System.in
[英]Scanner(System.in) - infinite loop
为什么我在递归方法中遇到无限循环,而没有机会输入任何符号来破坏它?
class Test {
int key=0;
void meth(){
System.out.println("Enter the number here: ");
try(Scanner scan = new Scanner(System.in)) {
key = scan.nextInt();
System.out.println(key+1);
} catch(Exception e) {
System.out.println("Error");
meth();
}
}
}
class Demo {
main method {
Test t = new Test();
t.meth();
}
}
如果您尝试创建错误(将字符串值输入键,然后尝试向其添加数字),则您将在控制台中获得无限的“错误”文本,而不是在第一次错误后,程序应再次询问该数字和然后才决定要做什么。
如果nextInt()
失败,它将引发异常,但不使用无效数据。 从文档中 :
当扫描程序引发
InputMismatchException
,扫描程序将不会传递导致异常的令牌,以便可以通过其他方法检索或跳过该令牌。
然后,您再次递归调用meth()
,它将再次尝试使用相同的无效数据,再次失败(不使用它),然后递归。
首先,我不会在这里首先使用递归。 首选简单循环。 接下来,如果输入无效,则应在再次尝试之前适当地使用它。 最后,考虑使用hasNextInt
而不是仅使用nextInt
并捕获异常。
所以也许是这样的:
import java.util.Scanner;
class Test {
public static void main(String[] args){
try (Scanner scanner = new Scanner(System.in)) {
System.out.println("Enter the number here:");
while (!scanner.hasNextInt() && scanner.hasNext()) {
System.out.println("Error");
// Skip the invalid token
scanner.next();
}
if (scanner.hasNext()) {
int value = scanner.nextInt();
System.out.println("You entered: " + value);
} else {
System.out.println("You bailed out");
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.