繁体   English   中英

尝试使用资源关闭订单

[英]Try-with-resources close order

我正在查看Java中try-with-resources的示例,我理解以下内容:

try (Connection conn = DriverManager.getConnection(url, user, pwd);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(query);) {
  ...
}

所以,关闭的顺序是:

rs.close();
stmt.close();
conn.close();

这是完美的,因为连接有一个语句,一个语句有一个结果集。

但是,在以下示例中,关闭的顺序我认为它与预期相反:

例1:

try (FileReader fr = new FileReader(file);
     BufferedReader br = new BufferedReader(fr)) {
  ...
}

结账的顺序是:

br.close();
fr.close();

例2:

try (FileOutputStream fos = new FileOutputStream("testSer.ser");
    ObjectOutputStream oos = new ObjectOutputStream(fs);) {
    ...
}

结账的顺序是:

oos.close();
fos.close();

这些例子是否正确? 我认为这些例子中的结果应该是不同的,因为:

  1. 在示例1中,BufferedReader具有FileReader。
  2. 在示例2中,ObjectOutputStream具有FileOutputStream。

排序是相同的:它始终与指定资源的顺序相反。 来自JLS

资源以与初始化资源相反的顺序关闭。

但是,如果稍后指定的资源本身调用先前指定的资源的close()方法(如BufferedReaderObjectOutputStream的情况),则可能看起来它们没有按预期顺序发生(并且close()将被多次调用)。

当我说“连接有声明而声明有结果集”时,我认为我不对。 也许它是相反的“结果集有一个语句和一个语句有一个连接”或者至少“一个结果集是由一个语句创建的,一个语句是由一个连接创建的”。

所以我认为:

try (Parent parent = new Parent();
     Child child = parent.createChild();) {
    ...
}

相当于:

try (Parent parent = new Parent();
     Child child = new Child(parent);) {
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM