try with resource 的使用
2020-10-03 本文已影响0人
早点起床晒太阳
参考资料
https://juejin.im/entry/6844903446185951240
https://blog.csdn.net/fly910905/article/details/86093723
背景
我们在获取io流 或者 JDBC 连接的时候,我们总要在最后关闭一下它。之前的做法是吧它放到finally块里面,确保它最后无论如何能关闭,防止资源的泄露,但是同时带出来的效果是代码冗长。
解析
样例
try with resource解决了这个问题,这块代码很简单,我直接上一个获取JDBC 相关的简单示例
public static String getCurrentDatabase() throws Exception {
try (Connection connection = getConnection();
Statement state = connection.createStatement();
ResultSet resultSet = state.executeQuery("select current_database()")) {
while (resultSet.next()) {
String database = resultSet.getString(1);
return database;
}
throw new Exception("not found database");
} catch (SQLException e) {
throw new Exception("aaa");
}
}
将要释放资源的对象放到 try()中包裹起来,这样它在执行完的时候会自动释放资源
使用try with resource的前提
资源必须实现AutoClosable接口。该接口的实现类需要重写close方法:
释放资源的顺序
当我写完上述代码之后,突然有个疑问,就是它释放资源的顺序是什么呢。比如万一先释放的connection的话,那state 和 resultset的引用也变得没有了意义。
解决的办法是在IDEA上查看它的反编译的代码 在target/class里面 (class本来是二进制,但是IDEA会将其进行反编译。这里说下 JDJUI对其进行反编译的话是看不到的,只会看到你使用 try with resource 写的代码,而不是优化后的代码,因为JDJUI不会对其进行优化),就会发现
释放资源的顺序是 资源的关闭方法按其创建的相反顺序调用。 就是 result --> state --> connection的顺序执行的。