尝试使用资源时会引发异常,同时自动关闭资源时会引发异常

问题描述

想象一下一种情况,在尝试使用资源块时发生异常。它将调用close方法关闭资源。如果close方法也抛出异常,将会发生什么。会抛出哪个异常??

解决方法

答案是:两者!第一个要突出一些。

首先,您的内部异常将被抛出。然后,将调用Closeable的close()方法,如果该方法也引发了异常,则第一个方法将抑制。您可以在堆栈跟踪中看到它。

测试代码:

public class DemoApplication {

    public static void main(String[] args) throws IOException {

        try (Test test = new Test()) {
            throw new RuntimeException("RuntimeException");
        }
    }

    private static class Test implements Closeable {
        @Override
        public void close() throws IOException {
            throw new IOException("IOException");
        }
    }
}

控制台日志:

Exception in thread "main" java.lang.RuntimeException: RuntimeException
    at DemoApplication.main(DemoApplication.java:15)
    Suppressed: java.io.IOException: IOException
        at DemoApplication$Test.close(DemoApplication.java:22)
        at DemoApplication.main(DemoApplication.java:16)

如果愿意,可以使用exception.getSuppressed()来获取抑制的异常。