图集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代码块中的语句.