try-with-resources 可自动关闭资源,无需 finally 和判空;资源须在 try 括号内声明初始化,作用域限于 try 块;多资源按逆序关闭,java 9 支持复用 effectively final 变量。

直接把资源声明在 try 括号里,就能替代传统 try-catch-finally 中手动 close 的写法。不用判空、不写 finally、不嵌套异常处理,JVM 自动调用 close(),而且所有已成功初始化的资源都会被关闭,哪怕 try 块中途抛异常。
核心替换规则
传统写法要三段式:声明变量 → try 中使用 → finally 中判空并 close;而 try-with-resources 把声明和初始化合并到 try 括号中,关闭逻辑由编译器生成。
- ✅ 正确姿势:资源必须在 try 后的括号内声明并初始化,例如
try (BufferedReader br = new BufferedReader(...)) - ❌ 错误姿势:先在外面声明变量(如
BufferedReader br = null;),再在 try 块里赋值——这样不会触发自动关闭 - ⚠️ 注意:资源变量作用域仅限 try 块内,catch 或 finally 中无法访问该变量
单资源场景对比
读取文件的传统写法通常有 10+ 行,含冗余判空和嵌套 try-catch;换成 try-with-resources 后,结构清晰、行数减半:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 传统方式要自己确保
br.close()在 finally 中执行,且需捕获 close 可能抛出的IOException - 新写法只需一行声明,close 自动发生;若
br.close()抛异常,它会被作为“抑制异常”附加到主异常上,不丢失信息
多资源协同使用
多个流或连接可同时声明,用分号隔开,比如文件复制或数据库事务中同时操作 Connection 和 PreparedStatement:
- 关闭顺序是**声明的逆序**:后声明的先关,先声明的后关。例如
try (InputStream in; OutputStream out),会先关out再关in - 这个顺序对装饰器链很关键——像
BufferedWriter包着FileWriter,必须先关外层缓冲,才能保证 flush 完毕、数据不丢 - 不用手动控制依赖关系,JVM 已按安全顺序处理
Java 9 起支持变量复用
如果资源变量已在外部声明且未被重新赋值(effectively final),Java 9+ 允许直接在 try 括号中复用,更灵活:
- 旧写法:
try (FileInputStream fis = new FileInputStream("a.txt")) { ... } - 新写法:
FileInputStream fis = new FileInputStream("a.txt"); try (fis) { ... } - 好处是便于提前校验路径、统一异常处理入口,或与其他逻辑共享同一实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










