其他答案涵盖了如果在不抛出的情况下退出JVM时catchand finally块如何不运行,但是它们没有显示出资源的“ try-with-resources”块中会发生什么:它们是否关闭了?System.exitSecurityException
根据JLS,第14.20.3.2节:
转换的结果是将资源规范“放在” try语句内。这允许扩展try-with-resources语句的catch子句捕获由于自动初始化或关闭任何资源而导致的异常。
此外,与finally关键字的意图保持一致,到执行finally块时,所有资源都将被关闭(或试图关闭)。
也就是说,资源将close在a catch或finallyblock运行之前被d 占用。如果他们都close以某种方式ð即使catch和finally不跑?
这是一些代码,用于证明“ try-with-resources”语句中的资源也未关闭。
我使用一个简单的子类BufferedReader在调用之前打印一条语句super.close。
class TestBufferedReader extends BufferedReader {
public TestBufferedReader(Reader r) {
super(r);
}
@Override
public void close() throws IOException {
System.out.println("close!");
super.close();
}
}
然后,我建立了System.exit在try-with-resources语句中调用的测试用例。
public static void main(String[] args)
{
try (BufferedReader reader = new TestBufferedReader(new InputStreamReader(System.in)))
{
System.out.println("In try");
System.exit(0);
}
catch (Exception e)
{
System.out.println("Exception of type " + e.getClass().getName() + " caught: " + e.getMessage());
}
finally
{
System.out.println("finally!");
}
}
输出:
尝试中
因此,不仅成功,catch而且finally块不运行,close如果System.exit成功,“尝试使用资源”语句也不会获得其资源的机会。