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

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

执行顺序 无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:

return returnfinally

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

testb()方法ouput:

finally finallyreturn

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

testc()方法ouput:

catchreturn catchreturnfinally

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

参考资料

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