标准答案
- 资源按声明的逆序关闭,适合流、连接、Statement 和锁外的可关闭资源。
- 主体异常通常是主要异常,close 期间异常作为 suppressed 保留,便于诊断。
- 资源对象的 close 应尽量幂等,业务仍要在事务和连接池边界正确提交或回滚。
- 不能因为自动 close 就忽略读取、超时和部分写入失败。
题目解析
try-with-resources 在离开代码块时按声明逆序调用 close,即使主体抛异常也会执行,适合流、Statement 和明确可关闭的资源。它把释放动作固定在语法边界内,减少异常路径遗漏。
主体异常通常保留为主异常,close 异常作为 suppressed 附加,诊断时要把两者都记录。资源 close 最好幂等,但不能假设关闭失败不会影响数据完整性。
Connection 关闭在连接池语义下通常是归还而非物理断开,事务提交、回滚和连接状态重置仍由事务/池边界负责。自动 close 不会撤销已经发出的外部副作用。
常见误区
- 误区:手动 close 与 try-with-resources 重复关闭。改正:让资源生命周期由一个明确的 owner 管理,并确认 close 是否幂等。
- 误区:只记录主异常而丢弃 suppressed。改正:日志和监控保留 suppressed 异常,它可能包含真正的释放故障。
- 误区:连接关闭前没有处理事务状态。改正:确认提交或回滚,由事务管理器和连接池重置状态后再归还。