Java SE 9:Try-With-Resources 改进

时间:2020-02-23 14:37:02  来源:igfitidea点击:

在本文中,我们将讨论Java SE 9中的Try-With-Resources的一些改进。
现在让我们开始探索该构造。

Java SE 7:Try-With-Resources 基础

Java SE 7引入了一个新结构:Try-With-Resources语句,用于更好的异常处理。
没有这种构造,开发人员就不得不编写大量的冗余和丑陋的代码。
如果开发人员忘记正确关闭资源,我们将在应用程序中遇到资源泄漏问题。

此新功能的主要目标是:

  • 语法糖

避免编写一些摘录捕获/最终块。

  • 更好的可读代码
  • 无需做空检查

无需检查资源引用是指对象还是null。

  • 更好的资源管理

ARM(自动资源管理)

  • 为了避免内存泄漏

尝试使用资源示例1:

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("theitroad.txt"));
 try (BufferedReader reader2 = reader1) {
 System.out.println(reader2.readLine());
 }
}

其中我们创建了一个实用程序方法,该方法创建一个BufferedReader对象以读取文件的内容。
如果我们观察上述代码片段,即使我们的reader1引用了BufferedReader对象,我们也应该创建一个重复的" reader2"以在Try-With-Resources中使用它。
它是Java SE 7或者8版本中的一个小错误或者问题。

我们不能在Try-With-Resources语句的try()块内使用任何资源(在Try-With-Resources外部声明)。

以下代码在Java SE 7或者8版本中无效。
它会引发编译时错误。

Try-With-Resources 示例2:

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("theitroad.txt"));
 try (reader1) {
 System.out.println(reader1.readLine());
 }
}

注意:-如果您想阅读有关此组件的更多信息,请完成本教程:Java SE 7:Try-with-Resources

Java SE 7:Try-With-Resources 规则

在Java SE 7或者8版本中,我们应遵循以下规则,以对自动资源管理(ARM)使用Try-With-Resources语句

  • 任何资源(预定义Java API类或者用户定义类)都必须实现java.lang.AutoCloseable。

  • 资源对象必须引用最终变量或者有效地最终变量

  • 如果已经在Try-With-Resources语句之外声明了Resource,则应使用局部变量重新引用(如上面的Example-1代码所示)

  • 该新创建的局部变量可以在Try-With-Resources语句中有效使用。

Java SE 9:Try-With-Resources 改进

Java SE 9对Try-With-Resources语句进行了一些改进。
正如我们在前几节中讨论的那样,Java SE 7或者8版本在此声明中存在一个小问题或者错误。

在Java SE 9中,如果我们拥有在Try-With-Resource语句之外已经声明为final或者有效final的资源,则无需声明局部变量。
我们可以在Try-With-Resource语句中使用先前创建的变量,而不会出现任何问题,如下所示:

尝试资源示例3:

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("theitroad.txt"));
 try (reader1) {
 System.out.println(reader1.readLine());
 }
}

该示例是Java SE 9的有效代码。
我们没有创建另一个本地变量(例如reader2)来引用Example1中所示的reader1。
让我们在Java SE 9 REPL中执行两个示例以对其进行测试。

使用Java SE 9 REPL的测试示例1:

jshell> void testARM_Before_Java9() throws IOException{
 ...> BufferedReader reader1 = new BufferedReader(new FileReader("theitroad.txt"));
 ...> try (BufferedReader reader2 = reader1) {
 ...> System.out.println(reader2.readLine());
 ...> }
 ...> }
|  created method testARM_Before_Java9()

jshell> testARM_Before_Java9()
theitroad

使用Java SE 9 REPL的测试示例3:

jshell> void testARM_Java9() throws IOException{
 ...> BufferedReader reader1 = new BufferedReader(new FileReader("theitroad.txt"));
 ...> try (reader1) {
 ...> System.out.println(reader1.readLine());
 ...> }
 ...> }
|  created method testARM_Java9()

jshell> testARM_Java9()
theitroad