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

Java捕获通用Exception仍触发异常:非整数输入时流程异常问题排查

异常捕获逻辑失效问题说明

实际表现

  • 代码中已编写捕获所有Exception类型的catch重试块:输入超出数组边界的整数下标时,catch能正常触发、执行重试逻辑
  • 输入字母等非整数内容时,程序直接抛出未预期异常,完全无法走到预设的重试流程

原始实现代码

public class TryCatch {
    public static void main(String[] args) {
        int Score[] = {5,3,9};  //自定义测试数组
        Scanner sc = new Scanner(System.in);
        boolean flag=true; //循环控制标记,持续获取输入直到输入合法
        System.out.println("Enter index: ");
        int ind = sc.nextInt(); //读取用户输入的数组下标
        while(flag){
            try {
                System.out.println("Value at index is = " + Score[ind]);
                flag= false;      //输入合法时终止循环
            } catch (Exception e) {  
                System.out.println("Enter a valid value!");
                ind = sc.nextInt();  //输入非法时重新获取输入
            }
        }
    }
}

核心原因

  • 程序中第一次调用sc.nextInt()的位置完全在try-catch的监控范围外,一旦该位置因为输入非整数抛出InputMismatchException,异常会直接向外抛出,不会进入catch分支
  • 即使异常发生在try块内部,Scanner遇到不匹配的输入时,并不会主动清除/跳过这部分无效内容,残留内容会一直留在输入缓冲区中;catch块内再次调用sc.nextInt()时,会反复读到这部分无效内容,连续抛出不匹配异常,最终中断程序执行
  • 之前测试数组越界场景时,异常是在try块内部访问数组元素时触发的,完全处于catch的捕获范围内,因此这部分场景下重试逻辑可以正常运行

已验证的修复方式

排查发现,在catch块中重新创建Scanner实例即可解决问题,对应逻辑为:

catch (Exception e) {
    System.out.println("Enter a valid value!");
    sc = new Scanner(System.in); // 新建实例会自动丢弃旧实例残留的无效输入缓冲
    ind = sc.nextInt();
}

补充:该问题也可以通过异常捕获后调用sc.nextLine()跳过缓冲区残留的无效输入实现修复,不需要反复创建Scanner实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 07:15:04