java原生jdbc资源管理需声明为null、按resultset→statement→connection顺序关闭,每个close()独立try-catch并记录异常,finally中不return或抛异常,catch按异常继承顺序从具体到宽泛排列。

Java中用原生JDBC操作数据库时,必须显式管理Connection、Statement(或PreparedStatement)、ResultSet这些资源。try-catch-finally是保障资源不泄漏的基础写法,尤其在无法使用Java 7+ try-with-resources的旧环境或兼容性要求下,需严格遵循关闭顺序和异常防护逻辑。
资源声明与初始化要置为null
三个核心资源变量应在try外部声明并初始化为null,避免未赋值就调用close()导致NullPointerException:
- Connection conn = null;
- PreparedStatement pstmt = null;
- ResultSet rs = null;
关闭顺序必须是ResultSet → Statement → Connection
这是JDBC规范要求:下游资源依赖上游连接,反向关闭可能引发SQLException或静默失败。每个close()都需独立try-catch包裹,防止前一个异常阻断后续关闭:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先检查rs != null,再try { rs.close(); } catch (SQLException e) { /* 记录但不抛出 */ }
- 同理处理pstmt.close(),再处理conn.close()
- 不要把多个close()塞进同一个try块里
finally块中不写return,也不抛出新异常
finally用于清理,不是业务出口。若在里面return,会覆盖try/catch中的返回值;若抛出未捕获异常,可能掩盖原始SQL错误:
- 禁止在finally里写return语句
- 所有close()异常都应捕获并记录(如e.printStackTrace()或用日志框架),但不向上throw
- 确保finally执行不受try/catch中return、break或continue影响
catch块要按异常具体性从上到下排列
JDBC常见异常如SQLException是检查型异常,必须处理。多个catch时,子类异常(如SQLTimeoutException)必须放在父类(SQLException)之前,否则编译不通过:
- catch (SQLTimeoutException e) { /* 超时专项处理 */ }
- catch (SQLException e) { /* 通用SQL错误兜底 */ }
- 不建议只写catch (Exception e),会模糊问题定位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










