章
目
录
Java 7 中引入的try-with-resources
语句允许我们声明要在try块中使用的 AutoCloseable资源 ,并保证在执行try块后资源将被关闭。
1.旧方法(Java 7之前)
在 Java 7 之前,如果我们打开一个资源,就必须使用try-catch-finally块。我们在try块中打开资源并在finally块中关闭它。JVM保证会执行finally块,因此我们知道即使在try块中出现异常,资源也会被关闭。
在下面的示例中,我们使用BufferedReader逐行读取文件。请注意我们如何在try块中打开读取器,然后在finally块中将其关闭。
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("C:/temp/test.txt"));
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
//handle exception
} finally {
try {
if (br != null)
br.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
在上面的示例中,finally
块是一个用于关闭资源的标准实现。你难道不觉得当我们明确知道关闭资源不会出现异常时,finally
块是不必要的吗?
2. try-with-resources
让我们使用新的try-with-resources语法重写前面的示例。看看代码有多简洁。
try (BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt"))) {
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
}
catch (IOException e) {
//handle exception
}
有两件事需要密切关注:
- 文件资源(BufferedReader)以特殊方式在try块中打开(在小括号内部)。
finally
块完全消失了。
一个重要的事情是,我们不应该手动调用close()
方法。这应该由JVM自动调用。手动调用close()
方法可能会导致意外结果。
3.运行原理
Java 7引入了一个新的超级接口java.lang.AutoCloseable
,它可以保存资源(比如文件或套接字句柄),直到被关闭为止。这个接口有一个名为close()
的方法,当退出一个声明了该对象的try
块时,该方法会被自动调用。
void close() throws Exception;
例如,BufferedReader已经实现了 close() 方法文件:
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
}
4。结论
让我们逐点回顾要点:
-
在Java 7之前,我们必须使用
finally
块来清理资源。虽然finally
块不是强制性的,但资源清理是为了防止系统损坏。 -
在Java 7中,不再需要显式地进行资源清理。使用
try-with-resources
语句时,资源会自动清理。 -
清理是因为新的
AutoCloseable
接口。它的close()
方法在try
块完成后由JVM调用。