You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含try-catch的While循环与Scanner:如何清空Scanner?

解决Scanner触发InputMismatchException后无限循环的问题

我完全懂你这个痛点——每次新建Scanner虽然能搞定问题,但总觉得有点“杀鸡用牛刀”,毕竟频繁创建对象不是最优解。其实问题的根源特别明确:当nextInt()(或其他类型匹配方法)遇到不匹配的输入时,Scanner并不会自动跳过这个错误内容,它的指针会死死停在无效输入的位置,下次循环调用读取方法时,还是会读到同一个无效值,自然就陷入无限抛异常的死循环了。

不用每次新建实例的话,有两种靠谱的解决思路:

1. 捕获异常时主动清理无效输入

当抓到InputMismatchException后,调用Scanner的next()或者nextLine()方法,把当前那个不匹配的输入内容“消耗”掉,这样Scanner的指针就会移动到下一个输入位置,下次就能正常读取新的输入了。

举个例子,你原来的错误代码大概是这样:

Scanner scanner = new Scanner(System.in);
while (true) {
    try {
        System.out.print("请输入整数:");
        int num = scanner.nextInt();
        System.out.println("你输入的是:" + num);
        break;
    } catch (InputMismatchException e) {
        System.out.println("输入无效,请重新输入整数!");
        // 这里没清理无效输入,导致循环卡死
    }
}

修改后加上清理步骤:

Scanner scanner = new Scanner(System.in);
while (true) {
    try {
        System.out.print("请输入整数:");
        int num = scanner.nextInt();
        System.out.println("你输入的是:" + num);
        break;
    } catch (InputMismatchException e) {
        System.out.println("输入无效,请重新输入整数!");
        // 跳过当前无效的输入内容
        scanner.next();
    }
}

如果用户输入的是带空格的长串无效内容,用nextLine()会更彻底,但要注意:如果之前nextInt()留下了换行符,可能需要额外调用一次nextLine()来清空换行。

2. 提前校验输入合法性(更优雅的方案)

与其等异常发生再补救,不如提前用hasNextInt()判断下一个输入是否是整数,从根源上避免异常触发,也就不存在残留输入的问题了。

代码示例:

Scanner scanner = new Scanner(System.in);
while (true) {
    System.out.print("请输入整数:");
    if (scanner.hasNextInt()) {
        int num = scanner.nextInt();
        System.out.println("你输入的是:" + num);
        break;
    } else {
        System.out.println("输入无效,请重新输入整数!");
        // 同样需要跳过无效输入
        scanner.next();
    }
}

这种方式逻辑更清晰,也符合“预防胜于治疗”的编程思路,代码可读性更高。

至于你之前用新建Scanner解决的原因,是因为每次新建的Scanner会重新绑定标准输入流,相当于重置了输入指针,但这种方式会额外创建对象,循环里频繁创建其实没必要,上面两种方法都能更高效地解决问题。

内容的提问来源于stack exchange,提问作者SzK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:03:11