转载

try-catch-finally顺序及return

今天看代码,遇到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:2
finally:3
2

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

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

原文  https://segmentfault.com/a/1190000020630080
正文到此结束
Loading...