亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

精通 Java Try-With-Resources:自动资源管理详解

精通 Java Try-With-Resources

探索 Java try-with-resources 语句如何简化资源处理、防止泄漏并提升代码可读性。

try‑with‑resources 结构保证括号内声明的所有资源在块退出时自动关闭,无论正常退出还是异常退出。资源 指实现 AutoCloseable 或 Closeable 的对象。

语法:

try (ResourceType resource = new ResourceType(...)) { // 使用资源 } catch (ExceptionType e) { // 处理异常 } 

使用步骤:

  1. 在 try 子句中实例化资源。
  2. 声明使用或关闭过程中可能出现的异常处理。
注意: 仅实现 AutoCloseable 的对象可被自动管理。


示例 1:安全读取文件

import java.io.*; public class Main { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println("Line =>" + line); } } catch (IOException e) { System.out.println("IOException in try‑with‑resources block =>" + e.getMessage()); } } } 

test.txt 缺失时输出:

IOException in try‑with‑resources block =>test.txt (No such file or directory)

文件存在时输出:

Line =>test line

此处 BufferedReader 块结束后自动关闭,无需 finally 子句。


被抑制的异常

try 块和资源关闭均抛异常时,try 块异常优先,另一个被抑制。可通过 Throwable.getSuppressed() 获取被抑制异常:

catch (IOException e) { System.out.println("Thrown exception =>" + e.getMessage()); for (Throwable t : e.getSuppressed()) { System.out.println("Suppressed exception =>" + t); } } 

为何使用 Try-With-Resources?

1. 消除手动清理

Java 7 前必须用 finally 关闭资源。这增加样板代码,且关闭本身抛异常时 finally 内需嵌套 try‑catch。try-with-resources 让清理隐式化:

BufferedReader br = null; try { br = new BufferedReader(new FileReader("test.txt")); // 使用 br } catch (IOException e) { // 处理 } finally { if (br != null) { try { br.close(); } catch (IOException ignored) {} } } 

上述模式比下面更冗长且易错:

try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { // 使用 br } 

2. 一条语句管理多资源

用分号分隔声明多资源。按声明逆序关闭。

try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { while (scanner.hasNext()) { writer.print(scanner.nextLine()); } } 

3. Java 9 增强

Java 9 放宽资源必须局部声明的要求。现可复用现有变量:

Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) { // 代码 } 

此特性在同一资源多处使用时提升可读性。


深入见解请参考官方 AutoCloseable 文档和 Java 9 JEP 326 发布说明。

java

  1. 精通 Java 运算符:类型、语法与实战示例
  2. Java 注释:类型、用法与最佳实践
  3. 精通 Java if…else:控制流全解析
  4. 精通 Java 增强 for 循环:语法、示例与最佳实践
  5. Java break 语句:用法、时机与标签 break 详解
  6. 精通 Java 数组:声明、初始化与操作全攻略
  7. 精通 Java 字符串:创建、方法与最佳实践
  8. 精通 Java 接口:概念、实现与最佳实践
  9. 精通 Java 匿名内部类:定义、语法与实战示例
  10. Java 注解详解:类型、放置位置与实战示例
  11. Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
  12. 深入理解 Java Vector:用法、特性及与 ArrayList 的对比