try-with-resources优先于try-finally

Posted lbhym

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了try-with-resources优先于try-finally相关的知识,希望对你有一定的参考价值。

参考资料:《Effective Java》、《Java核心技术 卷1》、https://www.cnblogs.com/flyingeagle/articles/10152925.html

基础回顾

1.finally子句

当代码抛出异常时,就会终止方法中剩余代码的处理,如果这个方法获取了一些本地资源,就必须要回收这些资源。

这时候可能就需要用到finally子句了。下列三种情况会执行finally子句:

1.代码没有抛出异常,程序优先执行完try语句中全部的代码,然后再执行finally子句中的代码。

2.当catch中捕获了异常,首先执行try语句中的代码,直到出现异常为止,然后跳过try语句中剩下的代码,去对应的catch中,最后执行finally语句中的代码。

3.代码抛出异常,但是不是由catch捕获,这种情况会首先执行try语句中的代码,直到出现异常为止,然后跳过try语句中剩下的代码去执行finally子句的语句。

注:try语句可以只有finally没有catch,也可以只有catch没有finally。

 

try-with-resources

普通的try-catch-finally语法如下:

        try{
            //业务代码
        }catch (Exception ex){
            //异常
        }finally {
            //最后执行的代码
        }

try-with-resources语法:

try (Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root", "admin");
             Statement statement = connection.createStatement();) {//连接数据库
            //小括号声明需要的资源
            //业务代码 
        } catch (SQLException e) {
            e.printStackTrace();//try-with-resources也可以使用catch和finally子句,功能一样
        }

与普通的try-catch-finally语句相比,主要区别是:

1.try后面加上小括号,在小括号里完成资源的初始化,同一个小括号里可以声明多个资源。

2.try块退出时,会自动调用close方法,这样就不用在finally里面显式的去关闭资源。

 

为什么要优先使用try-with-resources呢?主要原因如下:

如果只是一层,try-catch-finally并不会显得多么复杂。但是如果在try里面或者finally里面嵌套了其他更多的try-catch-finally,然后都需要显式的去关闭资源,会显得代码非常冗余。

值得注意的是,实现AutoCloseable接口是使用try-with-resources语句的前提

以上是关于try-with-resources优先于try-finally的主要内容,如果未能解决你的问题,请参考以下文章

try-with-resources优先于try-finally

tryresources优于try-finally

try-with-resources 语法简介

Try-with-resource'必须是变量声明'[重复]

在 Netbeans 中使用 try-with-resources

try-with-resources 失败但尝试有效