无限循环当在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