最近在坛子里看到有人问相关问题。
自己发现自己第一时间打错了。
所以又重新验证了一下。
先上结论给伸手党。
1.finally块和最外层有且只能有一个return,否则出编译期错误。(catch块不影响此结论)
----try块和最外层有且只能有一个return,否则出编译期错误。(try块有时,catch块也必须有return)
----return可以不写在外层而写在finally里,但是会报警告(标黄)。(try块,catch块不影响此结论)
2.finally有return时,不管有没有异常,都会从finally的return跑掉
----try块有return。没有异常(不进入catch块)时,finally块有return走finally,否则走try的return。
--------外层有也不走,其实是运行到try的return时,执行finally在返回try的return,但是finally也有return,所以相当于半路跑路了
----try块有return。有异常(进入catch块)时,finally块有return走finally,否则走catch的return。
--------解释同上,到finally时半路跑路了。
验证代码:
/**
* JAVA中try,catch,finally的return研究
* @author qian.xu
*
*/
public class MyReturn {
public String test(){
int[] a = new int[2];
try{
//for(int i=0;i<2;i++){ //正常系
for(int i=0;i<3;i++){ //异常系
//执行到i=2会报错
a[i] = i;
}
System.out.println("try块执行完毕");
//return "我是try块的return";
}catch(Exception e){
System.out.println("catch块被执行");
return "我是catch块的return";
}finally{
System.out.println("finally块被执行");
return "我是finally块的return";
}
//return "我是最后一个return";
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyReturn myReturn = new MyReturn();
System.out.println(myReturn.test());
}
}