Java中的try.catch语句中的finally和return同时存在时,finally语句是否会执行,若执行,那么执行顺序是什么?
结论:
- 不管有没有异常,finally块中代码都会执行;
- 当try.catch中有return时,finally仍然会执行;
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
- 在执行时,是return语句先把返回值写入内存中,然后停下来等待finally语句块执行完,return再执行后面的一段。
- 至于返回值到底变不变,当finally调用任何可变的API,会修改返回值;当finally调用任何的不可变的API,对返回值没有影响。
举例:
1、try{}catch(){}return;
按照正常的顺序执行并返回。
2、try{return;}catch(){}finally{}return;
程序执行try代码块中return之前的代码,再执行finally块,最后执行try中的return,finally后的return将不再执行。
3、try{ } catch(){return;} finally{} return;
程序执行try代码块中的代码,
- 没有异常:执行finally中的代码,再执行return。
- 发生异常:执行catch中return之前的代码,再执行finally语句中的代码,再执行catch中的return,finally后的return将不再执行。
4、try{return;}catch(){} finally{return;}
程序执行try代码块之前的代码,再执行finally语句块,因为finally中有return,所以try中的return将不再执行。
5、try{} catch(){return;}finally{return;}
程序执行try代码块中的代码,
- 没有异常,直接执行finally并执行finally中的return执行结束;
- 发生异常,执行catch代码块中retrun之前的代码,再执行finally块中的代码,由于finally中有return则直接返回,所以catch中的return将不再执行。
6、try{ return;}catch(){return;} finally{return;}
程序执行try代码块中return之前的代码,
- 没有异常:执行finally中的语句,由于finally中有return则直接返回结束程序。
- 发生异常:执行catch块中return中的语句,再执行finally语句,由于finally中有return则直接返回结束程序。
最终结论:任何try或者catch中的return语句之前,如果finally存在的话,都会先执行finally语句,如果finally中有return语句,那么程序就结束了。