JAVA中try,catch,finally的return研究

来源:互联网 发布:郑州黑马程序员官网 编辑:程序博客网 时间:2024/06/06 13:05

最近在坛子里看到有人问相关问题。

自己发现自己第一时间打错了。

所以又重新验证了一下。

先上结论给伸手党。


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 stubMyReturn myReturn = new MyReturn();System.out.println(myReturn.test());}}