今天看代码,遇到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的。因为对于复杂类型,保存的是它的地址。