try与finally块中return的有关问题
try与finally块中return的问题今天在网上看到相关的文章,复制好的情况1:try{} catch(){} finally{} return
try与finally块中return的问题
今天在网上看到相关的文章,复制好的
情况1:try{} catch(){} finally{} return;
package?com.lwf.eus.servlet; public?class?Test{?? - ????public?static?void?main(String[]?args){ ?????????System.out.print(tt());???
- ????}??? ????public?static?int?tt(){???
- ?????????int?b?=?23;??? ?????????try{???
- ?????????????System.out.println("yes"); ?????????????b?+=?88;
- ?????????}catch(Exception?e){??? ?????????????System.out.println("error?:"?+?e);
- ?????????}finally{??? ??????????????if(b>25){???
- ??????????????????System.out.println("b>25?:"+b);??? ??????????????}???
- ??????????????System.out.println("finally");??? ?????????}
- ????????? ?????????return?101;?????????????//---4
- ????} }
显然程序按顺序执行,最后return 101退出
结果:
yes - b>25?:111 finally
- 101
情况2:try{ return; } catch(){} finally{} return;
package?com.lwf.eus.servlet; public?class?Test{?? - ????public?static?void?main(String[]?args){ ?????????System.out.print(tt());???
- ????}??? ????public?static?int?tt(){???
- ?????????int?b?=?23;??? ?????????try{???
- ?????????????System.out.println("yes"); ?????????????b?+=?88;
- ?????????????return?b;????????????//---1 ?????????}catch(Exception?e){???
- ?????????????System.out.println("error?:"?+?e); ?????????}finally{???
- ??????????????if(b>25){??? ??????????????????System.out.println("b>25?:"+b);???
- ??????????????}??? ??????????????System.out.println("finally");???
- ?????????} ?????????
- ?????????return?101;?????????????//---4 ????}
- }
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;
finally块之后的语句,这里的4处return,因为程序在1处已经return所以不再执行。
结果:
yes - b>25?:111 finally
- 111
情况3:try{ } catch(){ return;} finally{} return;
package?com.lwf.eus.servlet; public?class?Test{?? - ????public?static?void?main(String[]?args){ ?????????System.out.print(tt());???
- ????}??? ????public?static?int?tt(){???
- ?????????int?b?=?23;??? ?????????try{???
- ?????????????System.out.println("yes"); ?????????????b?+=?88;
- ?????????}catch(Exception?e){??? ?????????????System.out.println("error?:"?+?e);
- ?????????????return?b;????????????//---2 ?????????}finally{???
- ??????????????if(b>25){??? ??????????????????System.out.println("b>25?:"+b);???
- ??????????????}??? ??????????????System.out.println("finally");???
- ?????????} ?????????
- ?????????return?101;?????????????//---4 ????}
- }
程序先执行try,如果遇到异常执行catch块,
??? 有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行
catch块中return. finally之后也就是4处的代码不再执行。
??? 无异常:执行完try再finally再return.
结果:本次为无异常结果(当然本示例没有设计异常)
yes - b>25?:111 finally
- 101
情况4:try{ return; } catch(){} finally{return;}
package?com.lwf.eus.servlet; public?class?Test{?? - ????public?static?void?main(String[]?args){ ?????????System.out.print(tt());???
- ????}??? ????public?static?int?tt(){???
- ?????????int?b?=?23;??? ?????????try{???
- ?????????????System.out.println("yes"); ?????????????b?+=?88;
- ?????????????return?b;????????????//---1 ?????????}catch(Exception?e){???
- ?????????????System.out.println("error?:"?+?e); ?????????}finally{???
- ??????????????if(b>25){??? ??????????????????System.out.println("b>25?:"+b);???
- ??????????????}??? ??????????????System.out.println("finally");???
- ??????????????return?100;????????//---3 ?????????}
- ????????? ????}
- }
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:
yes - b>25?:111 finally
- 100
情况5:try{} catch(){return;} finally{return;}
package?com.lwf.eus.servlet; public?class?Test{?? - ????public?static?void?main(String[]?args){ ?????????System.out.print(tt());???
- ????}??? ????public?static?int?tt(){???
- ?????????int?b?=?23;??? ?????????try{???
- ?????????????System.out.println("yes"); ?????????????b?+=?88;
- ?????????}catch(Exception?e){??? ?????????????System.out.println("error?:"?+?e);
- ?????????????return?b;????????????//---2 ?????????}finally{???
- ??????????????if(b>25){??? ??????????????????System.out.println("b>25?:"+b);???
- ??????????????}??? ??????????????System.out.println("finally");???
- ??????????????return?100;????????//---3 ?????????}
- ????????? ????}
- }
程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:
yes - b>25?:111 finally
- 100
情况6:try{ return;} catch(){return;} finally{return;}
package?com.lwf.eus.servlet; public?class?Test{?? - ????public?static?void?main(String[]?args){ ?????????System.out.print(tt());???
- ????}??? ????public?static?int?tt(){???
- ?????????int?b?=?23;??? ?????????try{???
- ?????????????System.out.println("yes"); ?????????????b?+=?88;
- ?????????????return?b;????????????//---1 ?????????}catch(Exception?e){???
- ?????????????System.out.println("error?:"?+?e); ?????????????return?b;????????????//---2
- ?????????}finally{??? ??????????????if(b>25){???
- ??????????????????System.out.println("b>25?:"+b);??? ??????????????}???
- ??????????????System.out.println("finally");??? ??????????????return?100;????????//---3
- ?????????} ?????????
- ????} }
程序执行try块中return之前(包括return语句中的表达式运算)代码;
?? 有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出
?? 无异常:则再执行finally块,因为finally块中有return所以提前退出
无异常结果:
yes - b>25?:111 finally
- 100
以下情况
情况1:try{} catch(){} finally{} return;
情况2:try{ return; } catch(){} finally{} return;
情况3:try{} catch(){ return;} finally{} return;
情况4:try{ return; } catch(){} finally{return;}
情况5:try{} catch(){return;} finally{return;}
情况6:try{ return;} catch(){return;} finally{return;}
以上几种情况说明:
一、如果try catch finally块均无return则执行最后finally外的return;如果try catch finally中任何一个有return则最后finally外的return不再执行;
二、只要finally块中有return则try或catch中的return不再执行
以下几种情况在finally块的后面是不能出现return的。
情况:try{} catch(){} finally{ return;} return;
情况:try{ return; } catch(){} finally{return;} return;
情况:try{} catch(){return;} finally{return;} return;
情况:try{ return; } catch(){return;} finally{} return;
情况:try{ return; } catch(){return;} finally{return;} return;
上面几种情况因为finally块中已有return,而且是必须执行的,所以finally外的return必定不能执行,所以编译器提示错误。特殊的 try{ return; } catch(){return;} finally{} return;是因为try和catch中都有return所以必定会执行其中一个,所以finally外的return不能执行,所以编译器提示错误。
还有一种情况:
最终结论:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。