Java中多catch块需按“子类在前、父类在后”排序,优先捕获具体异常并定制响应,兜底Exception放最后;可合并无继承关系的异常类型;受检异常宜封装上抛,非受检异常重在预防与上下文补充;资源释放推荐try-with-resources。

Java中用多个catch块保护核心模块,关键不是堆砌捕获语句,而是让每种异常得到匹配的响应策略——既不遗漏关键错误,也不掩盖问题根源。
按异常具体性从上到下排列
多个catch块必须严格遵循“子类在前、父类在后”的顺序。例如处理用户输入校验模块时:
-
先写
NumberFormatException:专门处理字符串转数字失败,可提示“请输入有效数字” -
再写
IllegalArgumentException:应对业务规则不满足,比如年龄超出0–150范围 -
最后才写
Exception:仅作兜底,记录完整堆栈并告警,避免它提前截获子类异常
同逻辑异常合并处理(Java 7+)
当几种异常需执行完全相同的恢复动作(如统一记录日志+返回默认值),可用竖线(|)合并:
catch (ArithmeticException | ArrayIndexOutOfBoundsException | NullPointerException e)- 注意:合并的异常类型不能有继承关系,否则编译报错
- 参数
e隐式为 final,不可重新赋值
区分受检与非受检异常的处理意图
核心模块中,两类异常应体现不同设计立场:
立即学习“Java免费学习笔记(深入)”;
-
受检异常(如
IOException,SQLException):通常来自外部依赖,建议封装为自定义业务异常向上抛出,由调用方决定重试或降级 -
非受检异常(如
NullPointerException,IllegalArgumentException):多属编程疏漏,优先通过防御性校验预防;若已发生,应精准捕获并补充上下文(如打印当前操作ID、用户ID)便于定位
配合finally或try-with-resources保障资源安全
无论是否发生异常,数据库连接、文件流、网络Socket等必须释放:
- 传统方式:在
finally块中显式关闭,注意判空和嵌套异常吞并 - 推荐方式:使用
try-with-resources,自动调用close(),更简洁可靠 - 示例:读取配置文件时,即使解析抛出
JSONException,输入流也确保关闭


















