- 无论是否有异常,finally块都会执行;
- 当try和catch中有return时,finally也会执行;
- finally块在return后面的表达式运算完之后执行(此时并没有返回运算的的值,而是先把要返回的值保存起来,管finally中的代码怎么样, 返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
- finally中最好不要包含return,否则程序会有警告(finally block does not complete normally)可能会使程序提前退出,返回值不是try或catch中保存的返回值。
注:有两种情况finally块将不会执行
- 在try语句还没有执行就return了。故finally块被执行的充分必要条件:对应的try语句一定执行。
- 在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
- 正常情况:try{}catch(){}finally{}
顺序执行; -
try中带return的情况:try{return}catch(){}finally{}
try中return时返回值被保存,等finally执行完之后才能return完成;
- catch中带return的情况:try{}catch(){return}finally{}
与try中带return一样 -
finally中带return的情况:try{return}catch(){return}finally{return}
由于finally块中有return,会使程序提前退出并不执行try或catch中的return。
注:如果finally存在的话,任何执行try 或者catch中的return语句之前,都会先执行finally语句。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。