![Java核心编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/463/34752463/b_34752463.jpg)
5.8 try-with-resources语句的详细用法
关于try-with-resources语句,在前面章节也做过介绍,最早是在Java 7中引入的。在Java 9中,又对try-with-resources进行了改进,使得用户可以更加方便、简洁地使用try-with-resources语句。
为了演示try-with-resources语句的好处,先来看一个在Java 7之前对于资源处理的例子。
5.8.1 手动关闭资源
在Java 7之前,资源需要手动关闭。下面是一个很常见的文件操作的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P142_54888.jpg?sign=1738831616-CwoUVO06HbMedPACZQvU6RZ2ueZciU9W-0-081ad5d85a753096fabf5c826e1724c4)
在Java 7之前,一定要在finally中执行close,以释放资源。
5.8.2 Java 7中的try-with-resources介绍
try-with-resources是Java 7中一个新的异常处理机制,能够很容易地关闭在try-catch语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources语句确保了每个资源在语句结束时关闭。所有实现了java.lang.AutoCloseable接口(其中,它包括实现了java.io.Closeable的所有对象),可以使用作为资源。
例如,我们自定义一个资源类:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P142_54889.jpg?sign=1738831616-65WLxTYJVo3ywJqOXpyBqweo3s8405g2-0-d7643e3ce8f3fc8c2237e2b61a81c24e)
执行输出如下:
do something resource is closed
可以看到,资源终止被自动关闭了。
再来看一个例子,是同时关闭多个资源的情况:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P143_54891.jpg?sign=1738831616-iHUHx5NrUNG4xIaW0jK4SkI4jhv4eWPE-0-263805bd79843455bfc4966423a56e9a)
最终输出为:
do something do other things other resource is closed some resource is closed
在try语句中越是最后使用的资源,越是最早被关闭。
5.8.3 try-with-resources在Java 9中的改进
作为JEP 213规范(http://openjdk.java.net/jeps/213)的一部分,try-with-resources声明在Java 9中已得到改进。如果已经有一个资源是final或等效于final的变量,则可以在try-with-resources语句中使用该变量,而无须在try-with-resources语句中声明一个新变量。
例如,给定资源的声明:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P144_54895.jpg?sign=1738831616-QQ9bhJUTCuR0nBSAJLW1lC9HNzRf3Zwp-0-887b1b555c5336a47f450a73c46bea2d)
用老方法编写代码来管理这些资源是类似的:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P144_54896.jpg?sign=1738831616-NLmXTs6ICZnWN50nIXI8buXPzn9pxq2C-0-006e9fcc475825fe94cf25030b74d251)
而新方法可以是:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P144_54897.jpg?sign=1738831616-njGJYyW3xI1ee8pnmykBMntGPtmVS4C4-0-1c420166f4b8519fc1961e47ccc3fc96)
看上去简洁很多!