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
相关产品推荐
相关产品推荐

