了解 Try/Finally 抑制的异常

Une*_*hly 0 java exception try-catch try-catch-finally

我正在学习例外,我发现你可以有压抑的例外。我在 stackoverflow 上读了很多例子,但它们仍然不能像在“try/finally”情况下那样工作:

public class MultipleExceptionsExample {

   static class IOManip implements Closeable{
       @Override
       public void close() {
           throw new RuntimeException("from IOManip.close");
       }
   }

   public static void main(String[] args) {
       try(IOManip ioManip = new IOManip()){
           throw new RuntimeException("from try!");
       }catch(Exception e){
           throw new RuntimeException("from catch!");
       }finally{
           throw new RuntimeException("from finally!");
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

正如许多人所解释的,我应该得到所有行:“java.lang.RuntimeException:来自finally!” (是的,我愿意)

删除finally块我应该得到:“java.lang.RuntimeException:来自catch!” (是的,我愿意)

删除 catch 块我应该得到:

Exception in thread "main" java.lang.RuntimeException: from try!
    Suppressed: java.lang.RuntimeException: from IOManip.close
Run Code Online (Sandbox Code Playgroud)

我从来不这样做!为什么?我缺少什么?

通过删除 catch 块,我应该看到 try 消息,但我得到的是:

Exception in thread "main" java.lang.RuntimeException: from finally!
    at it.core.MultipleExceptionsExample.main(MultipleExceptionsExample.java:18)
Run Code Online (Sandbox Code Playgroud)

多谢。

And*_*ner 6

块中的 return 或 throwfinally会导致任何其他返回(或抛出)的结果被忽略。

不要returnthrow阻止finally,除非你真的知道自己在做什么。

应该注意的是,Java Throwables 有一个“抑制”异常的概念:您可以调用您捕获的addSuppressed异常;如果主体中发生异常并且在关闭资源时,Throwable这是通过try-with-resources块自动完成的;但对于投掷块来说,这种情况不会发生。finally