Java9 Try-With-Resources

Java9 Try-With-Resources

在这篇文章中,我们将讨论Java SE 9中的一些改进Try-With-Resources语句。现在让我们开始学习这个构造。

Java SE 7:Try-With-Resources基础知识

Java SE 7引入了一个新的构造:Try-With-Resources 语句,用于更好的异常处理。 如果没有这个构造,开发人员必须编写大量冗余和难看的代码。 如果开发人员忘记正确关闭资源,那么可能在应用程序中有资源泄漏问题。

这个新功能的主要目标是:

  • 语法更精简,避免写一些try-catch/finally块。
  • 代码且有更好的可读性
  • 不需要做空检查
  • 无需检查资源引用是指引用对象还是null
  • 更好的资源管理,ARM(自动资源管理)
  • 避免内存泄漏

Try-With-Resources 示例-1

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("mytest.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("mytest.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

Java SE 7:Try-With-Resources规则

在Java SE 7或8版本中,我们应该遵循这些规则为自动资源管理(ARM)来使用Try-With-Resources语句,

  • 任何资源(其中预定义的Java API类或用户定义的类)必须实java.lang.AutoCloseable
  • 资源对象必须引用final或有效的final变量
  • 如果资源已经在Try-With-Resources语句之外声明,则应该重新引用局部变量(如上面的示例-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语句中使用以前创建的变量,没有任何问题,如下所示:

Try-With-Resources 示例-3

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

这个例子是Java SE 9的有效代码。我们不会像示例1 所示的那样创建另一个局部变量,如reader2来引用reader1。下面在Java SE 9 REPL中执行这两个示例来测试它们。如下所示 -

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

jshell> testARM_Before_Java9()
mytest

测试示例-3使用Java SE 9 REPL

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

jshell> testARM_Java9()
mytest

上面就是“Java SE 9:Try-With-Resources改进”新功能的全部内容。