finally代码块
发布时间:2018-09-01, 16:24:17 分类:Linux | 编辑 off 网址 | 辅助
图集1/9
正文 946字数 353,906阅读
1.在try代码块之前结束方法,try代码块并没有得到执行,finally中的代码块也不会得到相应的执行。只有在try代码块得到执行的情况下,finally代码块才会得到执行。
2.当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。
3.当try和catch代码块中有return语句时
finally代码块要在try代码块中的return之前执行,所以当执行到finally代码块中的return时,方法就结束了,并返回。
是不是觉得结果有点出乎意料,最后一句输出语句的执行结果应该为2,可为什么是1呢?而且finally代码块中语句的确在try代码块return i之前得到执行了,finally代码块中的i也确实变成了2,可是为什么main函数打印出来的结果却是1呢?
通俗的说就是:先会把try或者catch代码块中的返回值保留,再来执行finally代码块中的语句,等到finally代码块执行完毕之后,在把之前保留的返回值给返回出去。
(请注意,前对于这条规则(保留返回值),只适用于 return和throw语句,不适用于break和continue语句,因为它们根本就没有返回值。)
这样就能够理解为什么打印的是1,而不是2了,这是因为try代码块中先会保留return返回的1,然后执行finally代码块中的++i,i的值虽然变成了2,可是保留的值还是1,没有变,所以等到finally代码块执行完毕之后,try代码块就会把保留值1给返回出去。
以上的两个例子比较好理解,接下来看一下下面这个例子,
是不是觉得很奇怪,num()方法中的打印语句居然在finally代码块中的打印语句之前被执行,而finally代码块的打印语句又在num()方法中的return 2;之前被打印,这又是为什么呢?
其实 return num(); 等同于下面这段代码
所以就会先打印num()方法中的语句,后打印finally代码块中的语句.
(支付宝)给作者钱财以资鼓励 (微信)→
有过 3 条评论 »
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。
它应该使用栈保存返回值。