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