多catch块需按继承关系从具体到宽泛排列,子类异常必须置于父类之前,否则后续catch块失效;java 7+支持catch (a | b e)合并处理同类异常;资源清理优先用try-with-resources,与多catch正交协同。

提升Java程序健壮性,关键在于让异常处理既精准又可控。多catch块不是堆砌语法,而是有策略地分层响应不同错误场景。
按继承关系从具体到宽泛排列
子类异常必须放在父类之前,否则后续catch块会变成“死代码”。比如ArithmeticException是RuntimeException的子类,若把RuntimeException写在前面,ArithmeticException永远捕获不到,编译器直接报错。
- 正确顺序示例:
catch (FileNotFoundException e)→catch (IOException e)→catch (Exception e) - 常见错误:把
Exception或Throwable放在最前,导致所有具体异常被提前拦截 - IDE通常会标出“unreachable catch block”,这是明确的重构信号
相同处理逻辑用单个catch合并
当多种异常需要统一提示或日志记录时,Java 7+支持竖线分隔的多类型捕获,避免重复代码。
- 写法:
catch (NullPointerException | ArrayIndexOutOfBoundsException e) - 注意:只能声明一个异常变量名,不能重复写
e多次 - 适用场景:用户输入校验失败、配置缺失、资源临时不可用等需统一降级处理的情况
结合finally或try-with-resources保障资源安全
多catch解决“怎么处理异常”,而资源释放解决“异常发生后还能否善后”。两者配合才真正提升健壮性。
- 传统方式:在
finally中判空关闭流、连接等,但需嵌套try-catch防关闭时再抛异常 - 推荐方式:优先使用
try-with-resources,自动调用close(),无需手动finally - 注意:资源声明必须实现
AutoCloseable接口,且初始化不能放在try块内
只捕获能处理的异常类型
不是所有异常都适合在当前层级捕获。检查型异常(如IOException)通常必须处理;运行时异常(如IllegalArgumentException)更适合提前校验预防。
- 避免写
catch (Exception e) { e.printStackTrace(); }——这等于放弃处理,还掩盖问题 - 对无法恢复的异常(如
OutOfMemoryError),捕获意义有限,应交由JVM或监控系统响应 - 业务层建议捕获自定义业务异常,保持底层技术异常向上透传
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











