Java含有return 的try catch finally的执行顺序

来源:互联网 发布:软件安装管理器下载 编辑:程序博客网 时间:2024/05/22 06:54

1try-catch-finally执行顺序:

一、执行try{}块;

二、如果try{}块有异常产生,执行catch{}块;

三、无论有没有异常都要执行finally{}块,这里可以看出只要finally中有return,必然返回finally{}中的return

如:
try{
  语句
1;
  语句
2;
  语句
3;
}catch(){
  语句
4;
}
finally{
  语句
5;
}
当语句1抛出异常时,执行顺序:1 4 5
当语句2抛出异常时,执行顺序:1 2 4 5
当语句1、2、3都没有异常时,执行顺序:1 2 3 5

 

2return的执行,

一、如果finally{}块中有return语句,只执行finally{}块中的return语句;

二、如果finally{}块中没有return语句,如果try{}有异常,则返回catch{}中的return语句,不然执行try{}return语句。

 

情况1

try{}catch(){}finally{} return;

显然程序按顺序执行。

情况2:

try{ return;}catch(){} finally{} return;

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行tryreturn;finally块之后的语句return,因为程序在try中已经return所以不再执行。

情况3:

try{ } catch(){return;}finally{} return;

程序先执行try,如果遇到异常执行catch块,有异常:则执行catchreturn之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。无异常:执行完tryfinallyreturn

情况4:

try{ return;}catch(){} finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
情况5:

try{} catch(){return;}finally{return;}

程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。

情况6:

try{ return;}catch(){return;}finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出。无异常:则再执行finally块,因为finally块中有return所以提前退出。

 

最终结论:任何执行try或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning


本篇整理自网络,参考资料为:

http://blog.csdn.net/luyee2010/article/details/8671187

http://bbs.csdn.net/topics/320241127

http://blog.csdn.net/aaoxue/article/details/8535754

······

0 0
原创粉丝点击