阿八博客
  • 100000+

    文章

  • 23

    评论

  • 20

    友链

  • 最近新加了很多技术文章,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

try-catch-finally顺序及return

欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/jsh/2019/1010/116562.html

今天看代码,遇到try-with-resource的语法
这一语法不太熟,因为之前一直以为是jdk8才有的,所以没怎么关注
网上查了下资料,发现原来jdk7就有了,真是惭愧

try-with-resource的作用是,针对需要自己释放资源的对象,无需通过finally代码块,而可以自动释放资源
只要资源对象实现了AutoCloseable接口

如何做到自动释放资源呢?通过反编译.class文件,发现编译器最终还是将try-with-resource代码,转换成了try-catch-finally格式

然后引出了这样一个问题:try-catch-finally的执行顺序是什么?
认真想了想,竟然对这块有点摸棱两可了,只能再查查资料,解除疑惑

finally代码块,一般用于释放资源,因为它的代码始终会被执行,即使try块中产生了异常或者return
这也是为何要用finally的原因
否则,try块中要释放资源,catch中也要释放资源,导致代码重复了

try-catch-finally的执行顺序是:try->catch->finally
即try执行完后,才执行finally
或者try中产生了异常,会执行catch中的代码,最后执行finally的代码
但是切记:finally的代码,是在try或者catch代码块的return之前执行

注意:finally中不要写return,否则会导致try和catch中的return失效
因为finally中return了,就不会再执行try中的return或者catch中的return了

还有一点注意,try和catch块return之前,会执行finally代码
然后执行finally之前,会暂时保存需要return的信息,执行完finally后,再return保存的信息

看代码:

public static void main(String[] args) {    System.out.println(testReturn());}private static int testReturn() {    int i = 1;    try {        i++;        System.out.println("try:" + i);        return i;    } catch (Exception e) {        i++;        System.out.println("catch:" + i);        return i;    } finally {        i++;        System.out.println("finally:" + i);    }}

执行结果:

try:2finally:32

这里,restReturn返回的是2,而不是3

如果i不是基本类型,而是List等这种复杂类型,finally中对它的改变,是会影响return的
因为对于复杂类型,保存的是它的地址

相关文章

暂住......别动,不想说点什么吗?
  • 全部评论(0
    还没有评论,快来抢沙发吧!