是否必须将内部 try-with-resources 放入内部 try-with-resources 或其中一个 try-with-resources 中的所有内容都将自动关闭?
Is it mandatory to put inner try-with-resources or everything inside one of the try-with-resources will be autoclosed?
是否必须将内部 try-with-resources 放入内部 try-with-resources 或其中一个 try-with-resources 中的所有内容都会自动关闭?
try (BasicDataSource ds = BasicDataSourceFactory.createDataSource(dsProperties)) {
// still necessary for Connection to close if inside
// try-with-resources?
try (Connection conn = ds.getConnection()) {
String sql = "SELECT * FROM users";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("email"));
System.out.println(rs.getString("password"));
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
在 try-with-resources 块中,只有 try
语句中的资源会被 try-with-resources 结构自动关闭。块内的其他资源是无关的,必须管理(*)。
但是,你可以在try
语句中放置多个资源,
而不是使用多个 try-with-resources(每个资源一个)例如:
try (PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("email"));
System.out.println(rs.getString("password"));
}
}
(*)正如 @alexander-farber 在评论中指出的那样,还有一些资源会被其他机制自动关闭,例如 ResultSet
在生成它的 Statement
关闭时关闭。尽管您没有显式管理这些资源,但它们是由它们的实现来管理的。
是否必须将内部 try-with-resources 放入内部 try-with-resources 或其中一个 try-with-resources 中的所有内容都会自动关闭?
try (BasicDataSource ds = BasicDataSourceFactory.createDataSource(dsProperties)) {
// still necessary for Connection to close if inside
// try-with-resources?
try (Connection conn = ds.getConnection()) {
String sql = "SELECT * FROM users";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("email"));
System.out.println(rs.getString("password"));
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
在 try-with-resources 块中,只有 try
语句中的资源会被 try-with-resources 结构自动关闭。块内的其他资源是无关的,必须管理(*)。
但是,你可以在try
语句中放置多个资源,
而不是使用多个 try-with-resources(每个资源一个)例如:
try (PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("email"));
System.out.println(rs.getString("password"));
}
}
(*)正如 @alexander-farber 在评论中指出的那样,还有一些资源会被其他机制自动关闭,例如 ResultSet
在生成它的 Statement
关闭时关闭。尽管您没有显式管理这些资源,但它们是由它们的实现来管理的。