无限循环当在try-catch块中捕获InputMidmatchException时
我一直在无限循环中捕获我的代码。
没什么可提升的,但我无法弄明白我的生活!
有人请帮忙
我只是重新创建了特定的错误,没有我在实际程序中的所有if语句。
package bs; import java.util.InputMismatchException; import java.util.Scanner; public class bs { public static void main(String[] args) { Scanner sc = new Scanner(System.in); boolean continueVar = true; while (continueVar) { try { System.out.println("Enter Something"); int input = sc.nextInt(); } catch (InputMismatchException i) { System.out.println("What the f***?"); continueVar = true; } } } }
捕获输入不匹配exception时会发生无限循环。 我认为它至少会要求用户重新输入他们的输入,但不是这样做,而是继续循环,如下所示:
run: Enter Something df What the f***? Enter Something What the f***? Enter Something What the f***?
它的行为就像只是忽略扫描仪对象sc?!
没有扫描仪没有被跳过,它只是从输入的开始处开始。 来自JavaDoc:
如果翻译成功,扫描仪将超过匹配的输入。
这意味着如果转换不成功,扫描仪将无法前进。 因此,您只需使用next()
手动跳过不正确的输入。
编辑:您可能想在尝试读取输入之前检查hasNextInt()
。
你循环而continueVar是真的,但你永远不会设置为false,所以循环永远不会退出。
我想你想在exception处理程序中将continueVar设置为false。
当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致exception的标记,因此可以通过其他方法检索或跳过它。
导致不匹配的令牌仍在扫描仪的缓冲区中。 在尝试再次扫描之前,您需要清除它。
你可以通过在catch块中调用next()
来做到这一点,如下所示:
catch (InputMismatchException i) { System.out.println("What the f***?"); sc.next(); }
此外,您不需要再次将continueVar
设置为true。 你永远不会把它设置为假,所以它将保持真实。 猜猜这是你把它移到迷你程序中的神器。
找到错误令牌时,扫描仪不会前进。 查看Scanner.java,第2095-2096行:
catch (NumberFormatException nfe) { position = matcher.start(); // don't skip bad token