在这篇文章中,我们将讨论Java SE 9中的一些改进Try-With-Resources
语句。现在让我们开始学习这个构造。
Java SE 7引入了一个新的构造:Try-With-Resources
语句,用于更好的异常处理。 如果没有这个构造,开发人员必须编写大量冗余和难看的代码。 如果开发人员忘记正确关闭资源,那么可能在应用程序中有资源泄漏问题。
这个新功能的主要目标是:
try-catch/finally
块。null
。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或8版本中,我们应该遵循这些规则为自动资源管理(ARM)来使用Try-With-Resources
语句,
java.lang.AutoCloseable
。final
或有效的final
变量Try-With-Resources
语句之外声明,则应该重新引用局部变量(如上面的示例-1中的代码所示)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改进”新功能的全部内容。