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改进”新功能的全部内容。
上一篇:Java9特性及示例
下一篇:Java9 Optional类
- Java教程
- Vim教程
- Swing教程
- Spring教程
- Spring Web Services教程
- Spring MVC教程
- Spring JDBC教程
- Spring Cloud教程
- Spring Boot教程
- Spring Boot CLI教程
- Spring Batch教程
- Spring AOP教程
- PDFBox教程
- JSP教程
- JSF教程
- JPA教程
- Java面向对象设计
- Java设计模式
- Java虚拟机教程
- Java泛型教程
- Java正则表达式教程
- Java数据类型教程
- Java并发编程教程
- Java密码学教程
- Java多线程教程
- Java国际化(i18n)教程
- JavaFX教程
- Java9教程
扫描二维码
程序员编程王