为什么我在递归方法中遇到无限循环,而没有机会输入任何符号来破坏它?
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()失败,则抛出异常,但不使用无效数据。从文档中:
nextInt()
当扫描程序抛出时InputMismatchException,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌。
InputMismatchException
然后meth(),您再次递归调用,这将尝试第二次使用相同的无效数据,再次失败(不使用它),然后递归。
meth()
首先,我不会在这里首先使用递归。首选简单循环。接下来,如果输入无效,则应在再次尝试之前适当地使用它。最后,考虑使用hasNextInt而不是仅使用nextInt并捕获异常。
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"); } } } }