原文: 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 FileOutputStream
String mystring = "We are writing this line in the output file.";
//Converting the given string in bytes
byte bytes[] = mystring.getBytes();
//Writing the bytes into the file
fileOutputStream.write(bytes);
//Displaying success message after the successful write operation
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
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 中此代码的屏幕截图。