哪个close()先运行?

Mor*_*ive 1 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此示例输出:

T 1 IOE F 
Run Code Online (Sandbox Code Playgroud)

如果我改变顺序那么......

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*eas 7

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

Java语言规范,第14.20.3.试用资源,说:

资源与初始化资源相反的顺序关闭.仅当资源初始化为非空值时才关闭资源.关闭一个资源的例外不会阻止关闭其他资源.如果先前由初始化程序,try块或资源关闭抛出异常,则会抑制此类异常.

这意味着close()方法打印1将始终执行,第一部分将回答您的"哪个close()先运行?" 题.