AutoCloseable close() 方法异常没有被抑制

Posted

技术标签:

【中文标题】AutoCloseable close() 方法异常没有被抑制【英文标题】:AutoCloseable close() method exception not getting suppressed 【发布时间】:2016-12-08 10:27:15 【问题描述】:

我正在 Java 8 中的一个简单应用程序中使用 try-with-resources。 我正在实现 AutoCloseable 接口并覆盖 close() 方法。 在我的一个实现 AutoCloseable 的类中,我在 close() 方法中抛出了一个异常,该方法将作为 Suppressed Exception 工作。在我的主要方法中,我发现了异常。但是 close 方法的异常并没有被抑制。由于捕获了一般异常,因此该异常被捕获在 catch 块中。

这是我的代码:

public class TryWithResourcesExample 

    public static void main(String[] args) 
        // TODO Auto-generated method stub
        try (Lion lion = new Lion(); Tiger tiger = new Tiger()) 

            lion.hunt();
            tiger.hunt();

         catch (Exception e) 
            System.out.println("Got Simple Exception = "+e);
            for(Throwable t: e.getSuppressed())
            
                System.out.println("Got Suppressed Exception = "+t);
                t.printStackTrace();
            
         finally 
            System.out.println("Finally.");
        
    



class Tiger implements AutoCloseable 
    public Tiger() 
        System.out.println("TIGER is OPEN in the wild.");
    ;

    public void hunt() throws Exception 
        //throw new Exception("DeerNotFound says Tiger!");
    

    public void close() throws Exception 
        System.out.println("Tiger is CLOSED in the cage.");
    


class Lion implements AutoCloseable 

    public Lion() 
        System.out.println("LION is OPEN in the wild.");
    

    public void hunt() throws Exception 
        //throw new Exception("DeerNotFound says Lion!");
    

    public void close() throws Exception 
        System.out.println("LION is CLOSED in the cage.");
        throw new Exception("Lion Unable to close the cage!");
    

这是我的输出:

LION is OPEN in the wild.
TIGER is OPEN in the wild.
Tiger is CLOSED in the cage.
LION is CLOSED in the cage.
Got Simple Exception = java.lang.Exception: Lion Unable to close the cage!
Finally.

为什么 close 方法中的异常没有被抑制?

【问题讨论】:

不要将“抑制”与“吞咽”混为一谈 【参考方案1】:

我认为您必须再次阅读有关try-with-resource 的文章。

仅当有多个异常时才会抑制异常。还指定了一个顺序,如本例所示,何时以及哪些异常被抑制:

public class Test 
  public static void main(String... args) 
    try (ExceptionResource test = new ExceptionResource()) 
      test.work();
     catch (Exception e) 
      e.printStackTrace();
    
  


class ExceptionResource implements AutoCloseable 

  public void work() throws Exception 
    throw new Exception("Thrown in 'run'");
  

  @Override
  public void close() throws Exception 
    throw new Exception("Thrown in 'close'");
  

结果:

java.lang.Exception: Thrown in 'run'
at test.ExceptionResource.work(Test.java:16)
at test.Test.main(Test.java:6)
Suppressed: java.lang.Exception: Thrown in 'close'
    at test.ExceptionResource.close(Test.java:21)
    at test.Test.main(Test.java:7)

【讨论】:

以上是关于AutoCloseable close() 方法异常没有被抑制的主要内容,如果未能解决你的问题,请参考以下文章

Closeable 和 AutoCloseable close() 方法的执行顺序

源码分析-AutoCloseable

JDK7 AutoCloseable

try(){}自动释放资源,AutoCloseable

浅谈JAVA中的AutoCloseable接口

浅谈JAVA中的AutoCloseable接口