美文网首页
try with resource 的使用

try with resource 的使用

作者: 早点起床晒太阳 | 来源:发表于2020-10-03 11:11 被阅读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的顺序执行的。

相关文章

网友评论

      本文标题:try with resource 的使用

      本文链接:https://www.haomeiwen.com/subject/dckwuktx.html