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改进”新功能的全部内容。