【发布时间】:2019-03-12 23:07:37
【问题描述】:
我正在查看 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 中,BufferedReader 具有 FileReader。
- 在示例 2 中,ObjectOutputStream 具有 FileOutputStream。
【问题讨论】:
-
br依赖于fr(就像rs依赖于stmt依赖于conn),所以br应该首先关闭(并且br也会关闭fr本身)。您的期望是错误的;你可能想解释一下为什么你认为应该先关闭fr(和fos)。
标签: java jdbc java-io try-with-resources autocloseable