原文: https://beginnersbook.com/2018/05/java-9-try-with-resources-enhancements/
try-with-resource语句首先在 Java 7 中引入。该语句在 Java 9 中得到了重大改进。在本指南中,我们将讨论 Java 9 中try-with-resource语句的改进。
什么是try-with-resource?
这个语句最初是在 Java 7 中引入的,以避免我们为异常处理编写的冗余代码。这句话的优点是:
- 尝试用资源自动关闭所有资源(文件,数据库连接,网络连接等)。无需明确关闭它们。这可以防止内存泄漏。
- 借助
try-with-resource,我们可以减少不必要的代码行,使代码更具可读性。
我们以前如何使用try-with-resource在 Java 7 中编写代码?
这就是我们在 Java 7 中使用Try-With-Resource语句的方式。
import java.io.FileNotFoundException;import java.io.FileOutputStream;public class JavaExample {public static void main(String[] args) throws FileNotFoundException {try(FileOutputStream fileOutputStream = new FileOutputStream("beginnersbook.txt");){//We are writing this string in the output file using FileOutputStreamString mystring = "We are writing this line in the output file.";//Converting the given string in bytesbyte bytes[] = mystring.getBytes();//Writing the bytes into the filefileOutputStream.write(bytes);//Displaying success message after the successful write operationSystem.out.println("The given String is written in the file successfully");}catch(Exception e) {System.out.println(e);}}}
输出:
The given String is written in the file successfully
Java 7 中的try-with-resource问题
Java 7 中的Try-With-Resource语句存在某些问题。此语句不允许在语句块(范围)之外声明资源。让我们举一个例子来理解这一点。
Java 7 - 在 Try-With-Resources 块之外声明的资源
import java.io.FileNotFoundException;import java.io.FileOutputStream;public class JavaExample {public static void main(String[] args) throws FileNotFoundException {FileOutputStream fileOutputStream = new FileOutputStream("beginnersbook.txt");try(fileOutputStream){String mystring = "We are writing this line in the output file.";byte bytes[] = mystring.getBytes();fileOutputStream.write(bytes);System.out.println("The given String is written in the file successfully");}catch(Exception e) {System.out.println(e);}}}
Java 7 中的输出:
Compile-time error
上面的示例抛出编译时错误,因为资源是在Try-With-Resource语句的范围之外声明的。
Java 7 - 外部声明的资源 - 重复资源作为变通方法
为了解决上述错误,我们不得不在 Java 7 中做一个解决方法。我们过去常常复制资源引用,如下所示:
import java.io.FileNotFoundException;import java.io.FileOutputStream;public class JavaExample {public static void main(String[] args) throws FileNotFoundException {FileOutputStream fileOutputStream = new FileOutputStream("beginnersbook.txt");try(FileOutputStream fileOutputStream2 = fileOutputStream){String mystring = "We are writing this line in the output file.";byte bytes[] = mystring.getBytes();fileOutputStream2.write(bytes);System.out.println("The given String is written in the file successfully");}catch(Exception e) {System.out.println(e);}}}
这段代码在 Java 7 中运行良好。
注意try块中的FileOutputStream fileOutputStream2 = fileOutputStream行。我们在Try-With-Resource的范围内创建了对已声明的输出流的另一个引用。
Java 9 - try-with-resource改进
Java 9 为传统的Try-With-Resource语句提供了一个重要的改进。 Java 9 允许我们在 Try-With-Resource块之外声明资源。我们不再需要创建局部变量来访问资源。让我们采用与 Java 7 相同的示例,但遇到了编译错误。在 Java 9 中,此代码运行得非常好。
import java.io.FileNotFoundException;import java.io.FileOutputStream;public class JavaExample {public static void main(String[] args) throws FileNotFoundException {FileOutputStream fileOutputStream = new FileOutputStream("beginnersbook.txt");try(fileOutputStream){String mystring = "We are writing this line in the output file.";byte bytes[] = mystring.getBytes();fileOutputStream.write(bytes);System.out.println("The given String is written in the file successfully");}catch(Exception e) {System.out.println(e);}}}
输出:
The given String is written in the file successfully
Eclipse Oxygen 运行 Java SE 9 中此代码的屏幕截图。

