如何通过try-with-resources同时管理多个资源并探究其关闭顺序的原理?
- 内容介绍
- 相关推荐
本文共计1183个文字,预计阅读时间需要5分钟。
多个资源必须用分号分隔,并在 try 标签内声明,位置要规范;它们不是按书写顺序初始化,而是从左到右依次执行(或表达式求值),但关闭时按逆序——即最右侧声明的资源最先关闭。
常见错误是误以为“先声明先关闭”,结果在资源存在依赖关系时(比如 BufferedWriter 包裹 FileOutputStream)手动调用 close() 导致外层流关闭后内层流再关抛 IOException。而 try-with-resources 自动处理了这种嵌套依赖的关闭时序。
-
try (InputStream is = new FileInputStream("a.txt"); OutputStream os = new FileOutputStream("b.txt")) { ... }:os先于is关闭 - 若某资源构造失败(如
new FileInputStream("missing.txt")抛FileNotFoundException),已成功构造的前面资源会自动关闭(按逆序,即刚构造完的立刻关) - 所有资源类型必须实现
AutoCloseable;JDK 7+ 的Closeable是其子接口,完全兼容
为什么关闭顺序必须是逆序?看字节码和编译器生成逻辑
javac 并不会真的“记住声明顺序然后倒着关”。
本文共计1183个文字,预计阅读时间需要5分钟。
多个资源必须用分号分隔,并在 try 标签内声明,位置要规范;它们不是按书写顺序初始化,而是从左到右依次执行(或表达式求值),但关闭时按逆序——即最右侧声明的资源最先关闭。
常见错误是误以为“先声明先关闭”,结果在资源存在依赖关系时(比如 BufferedWriter 包裹 FileOutputStream)手动调用 close() 导致外层流关闭后内层流再关抛 IOException。而 try-with-resources 自动处理了这种嵌套依赖的关闭时序。
-
try (InputStream is = new FileInputStream("a.txt"); OutputStream os = new FileOutputStream("b.txt")) { ... }:os先于is关闭 - 若某资源构造失败(如
new FileInputStream("missing.txt")抛FileNotFoundException),已成功构造的前面资源会自动关闭(按逆序,即刚构造完的立刻关) - 所有资源类型必须实现
AutoCloseable;JDK 7+ 的Closeable是其子接口,完全兼容
为什么关闭顺序必须是逆序?看字节码和编译器生成逻辑
javac 并不会真的“记住声明顺序然后倒着关”。

