智慧大石
其他答案涵盖了如果在不抛出的情况下退出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成功,“尝试使用资源”语句也不会获得其资源的机会。