我了解到,如果try с ресурсами
在块中抛出异常,并且在块finally
中抛出另一个异常,那么原始异常不会丢失,而是被抑制并且可以使用方法获得getSuppressed()
。为了测试这一点,我编写了以下代码:
import java.io.*;
class test implements AutoCloseable{
public void close(){
throw new RuntimeException();
}
}
class Main{
static void qq(){
try(test q = new test()){
}
finally{
throw new Error();
}
}
public static void main(String[] args){
try{
qq();
}
catch(Throwable a){
System.out.println(a.getSuppressed().length);
}
}
}
我本来希望得到 1,但令人惊讶的是,我得到了 0。
1、为什么这里显示的是0而不是1?
2. 你能举个例子,getSuppressed().length 将输出大于 0。
try-with-resources 构造中的抑制异常是在 try 块的主体中引发异常后由 close 方法引发的异常。在这种情况下,异常将被自动添加为抑制
例子:
控制台输出:
原来主要异常是UnsupportedOperationException,在body中抛出,而在close方法中抛出的RuntimeException被抑制
如果如您的示例所示,finally 块中发生异常,则仅抛出 finally 块中的异常,并且不会自动填充此异常抑制的其他异常列表,如上例所示。但这可以手动完成,例如,您可以在此处查看有关抑制机制本身的简要说明。