想象一下一种情况,在尝试使用资源块时发生异常。它将调用close方法关闭资源。如果close方法也抛出异常,将会发生什么。会抛出哪个异常??
答案 0 :(得分:3)
答案是:两者!第一个要突出一些。
首先,您的内部异常将被抛出。然后,将调用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()
来获取抑制的异常。