[英]The try-with-resources
我有一个非常简单的问题,对我来说似乎很愚蠢,但是却问。BufferedReader如何调用Autocloseable接口的close()方法。 或我们如何实现可自动调用close()的Autocloseable。
它是语法糖。 Javac编译器在声明BufferedReader
的try
块的末尾,将close()
调用插入到已编译的类中,您可以看到是否使用javap -c
反汇编了类文件。
除了实现AutoCloseable
并提供close()
方法之外,您无需在自己的代码中做任何事情。 Java会在try
语句的末尾为您调用close()
方法。 考虑以下最小演示:
class MyCloseable implements AutoCloseable {
public void close() { System.out.println("Close was called"); }
}
public class Ac {
public static void main(String[] args) {
try (MyCloseable mc = new MyCloseable()) {
}
}
}
$ java Ac
Close was called
try(AutoClosable x = open()) {}
通常被视为的简写形式
try {
Resource x = open();
} finally {
x.close();
}
有两个实际差异:如果两个块就扔了,autoclosable try
声明会抛出异常从内try
声明,而try...finally
将抛出异常从finally块。 来自另一个块的异常将被抑制。
另外,确切的行为是这样的:
try(Autoclosable x = open) {
//do something
} do_close {
x.close();//not actually there - executed before catch and finally!
} catch (WhateverException e){
//catch an exception
} finally {
//finally do something
}
从Oracle Docs :
“ try-with-resources语句可以具有catch和finally块,就像普通的try语句一样。在try-with-resources语句中,任何catch或finally块都在声明的资源关闭后运行。”
因此,由于这两个技术细节,它不仅是语法糖,而且实际上在以前try...finally
将要使用的地方使用了它。
除了Autoclosable
afaik之外, Autoclosable
其他方法可以为其他接口模仿try-with-resources的行为。 如果您想在尝试后进行一些清理,则必须finally
使用或实现Autoclosable
。 终结器似乎做了类似的事情,但实际上却没有。 我只是在这里提到它们, 建议您不要使用它们 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.