Java SE 9:Try-With-Resources 改进
在本文中,我们将讨论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