首页 > 学院 > 开发设计 > 正文

finally在try和catch块以及return中的执行顺序

2019-11-06 06:51:28
字体:
来源:转载
供稿:网友

执行顺序无catch时当有catch时执行顺序图DEMO验证参考资料

执行顺序

无catch时

finally会在try包含的return之后执行,会在try外面的return之前执行

当有catch时

finally是在catch执行之后catch包含的return之前执行的

执行顺序图

try包含的return | v catch | v finally | v catch包含的return | v try外面的return(和catch块不能并存)

DEMO验证

package abc;/** * @ClassName: Test1 * @Description: TODO(这里用一句话描述这个类的作用) * @author bamboo <a href="mailto:zjcjava@163.com?subject=hello,bamboo&body=Dear Bamboo:%0d%0a描述你的问题:">Bamboo</a> * @date 2017年3月2日 下午2:49:55 * @since */public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub testa(); } public static Object testa() { // TODO Auto-generated method stub StringBuffer sb = new StringBuffer(""); try { return PRint(sb); } finally { sb.append("finally"); System.out.println(sb.toString()); } } public static Object testb() { // TODO Auto-generated method stub StringBuffer sb = new StringBuffer(""); try { } finally { sb.append("finally"); System.out.println(sb.toString()); } return print(sb); } public static Object testc() { // TODO Auto-generated method stub StringBuffer sb = new StringBuffer(""); try { int a=1; if(1==a){ throw new Exception(); } return print(sb); }catch(Exception e){ sb.append("catch"); return print(sb); }finally { sb.append("finally"); System.out.println(sb.toString()); } } public static Object print(StringBuffer sb) { // TODO Auto-generated method stub sb.append("return"); System.out.println(sb.toString()); return null; }}

testa()方法ouput:

returnreturnfinally

testa()方法是return在try的里面,从结果看先执行的retrun然后执行的finally;

testb()方法ouput:

finallyfinallyreturn

testb()方法是return在try的外面,从结果看先执行的finally然后执行的retrun;

testc()方法ouput:

catchreturncatchreturnfinally

testb()方法是return在try的外面,从结果看先执行的finally然后执行的retrun;

参考资料

http://www.ibm.com/developerworks/cn/java/j-lo-finally/ finally对基本类型和引用类型参数造成的影响 http://blog.csdn.net/imzoer/article/details/8037970


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表