在 Kathy Sierra 所著的《OCP Java SE 8 Programmer II》一书中,第 203 页指出:
“9.D是正确的”其中是
D。 RuntimeException c 没有抑制异常
但是当我尝试运行此代码时,输出抑制了 RuntimeException“a”的异常和 IOException 的主要异常。我错过了什么?
import java.io.Closeable;
import java.io.IOException;
public class Animals {
class Lamb implements Closeable {
public void close() {
throw new RuntimeException("a");
}
}
public static void main(String[] args) {
new Animals().run();
}
public void run() {
try (Lamb l = new Lamb();) {
throw new IOException();
} catch (Exception e) {
throw new RuntimeException("c");
}
}
}
在 catch 块中添加此代码将显示抑制的异常和 IOException
System.out.println("catch main: " + e);
for (Throwable t : e.getSuppressed()) {
System.out.println("catch suppressed " + t);
}
是的,
close
抛出的异常被尝试结束时的异常所抑制。您可以通过检查捕获的异常来观察这一点:
public void run() {
try (Lamb l = new Lamb();) {
throw new IOException();
} catch (Exception e) {
System.out.println("catched "+e);
for (var ex: e.getSuppressed())
System.out.println("suppressed "+ex);
throw new RuntimeException("c");
}
}
其执行导致:
catched java.io.IOException
suppressed java.lang.RuntimeException: a
Exception in thread "main" java.lang.RuntimeException: c
at Animals.run(Animals.java:20)
at Animals.main(Animals.java:11)
教程(请参阅尝试使用资源)说:
抑制异常
可以从与该关联的代码块中抛出异常 尝试使用资源语句。 [...] 如果 try 块抛出异常 并且从 try-with-resources 抛出一个或多个异常 语句,然后是从 try-with-resources 抛出的异常 语句被抑制,块抛出的异常是 一个被抛出的[...]。你可以 通过调用来检索这些被抑制的异常 Throwable.getSuppressed 方法来自 try 抛出的异常 块。
但是从 catch 中抛出的
Runtime
没有与之关联的受抑制异常。