哪个close()首先运行?

时间:2018-07-30 20:04:55

标签: java jdbc

如果我有多个资源,则在try catch中,首先关闭哪个资源?

public class TestRes {
  public static void main(String[] args) {
    TestRes tr = new TestRes();
    tr.test();
  }

  public void test() {
    try (MyResource1 r1 = new MyResource1(); MyResource2 r2 = new MyResource2(); ) {
       System.out.print("T ");
    } catch (IOException ioe) {
      System.out.print("IOE ");
    } finally {
      System.out.print("F ");
    }
  }

  class MyResource1 implements AutoCloseable {
    public void close() throws IOException {
      System.out.print("1 ");
    }
  }

  class MyResource2 implements Closeable {
    public void close() throws IOException {
      throw new IOException();
    }
  }
}

此示例输出:

T 1 IOE F 

如果我更改订单,那么...

public class TestRes {
  public static void main(String[] args) {
    TestRes tr = new TestRes();
    tr.test();
  }

  public void test() {
    try (MyResource2 r2 = new MyResource2(); MyResource1 r1 = new MyResource1();) {
       System.out.print("T ");
    } catch (IOException ioe) {
      System.out.print("IOE ");
    } finally {
      System.out.print("F ");
    }
  }

  class MyResource1 implements AutoCloseable {
    public void close() throws IOException {
      System.out.print("1 ");
    }
  }

  class MyResource2 implements Closeable {
    public void close() throws IOException {
      throw new IOException();
    }
  }
}

我得到相同的输出-为什么?

1 个答案:

答案 0 :(得分:7)

您似乎认为close()方法中的异常将阻止其他close()方法的调用。那是错误

Java语言规范的第14.20.3. try-with-resources部分说:

  

资源以与初始化时相反的顺序关闭。仅当资源初始化为非空值时,它才关闭。 关闭一个资源的异常不会阻止其他资源的关闭。如果初始化程序,try块或资源关闭之前已引发异常,则被抑制

这意味着将始终执行打印close()的{​​{1}}方法,并且第一部分回答您的“哪个1首先运行?” 问题。