try catch finally语句块中存在return语句时的执行情况剖析
2种场景
(1) try中有return,finally中没有return(注意会改变返回值的情形);(2) try中有return,finally中有return;
场景代码分析(idea亲测)
场景一:
1 //实例一:try中有return,finally中没有return 2 public class TryReturnFinally { 3 public static void main(String[] args) { 4 System.out.println(test()); 5 } 6 private static int test(){ 7 int num = 10; 8 try{ 9 System.out.println("try"); 10 return num += 80; 11 }catch(Exception e){ 12 System.out.println("error"); 13 }finally{ 14 if (num > 20){ 15 System.out.println("num>20 : " + num); 16 } 17 System.out.println("finally"); 18 } 19 return num; 20 } 21 }
run:
try num>20 : 90 finally 90
实例二:
1 //实例二:try中有return,finally中没有return,但是会改变返回值的情况 2 public class TryReturnFinally { 3 public static void main(String[] args) { 4 System.out.println(test()); 5 } 6 private static int test(){ 7 int num = 10; 8 try{ 9 System.out.println("try"); 10 return num; 11 }catch(Exception e){ 12 System.out.println("error"); 13 }finally{ 14 if (num > 20){ 15 System.out.println("num>20 : " + num); 16 } 17 System.out.println("finally"); 18 num = 100; 19 } 20 return num; 21 } 22 }
run:
try finally 10
过程剖析:当程序执行到try语句块中的return方法时,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally语句块中的程序, 在执行"num = 100"时,程序仅仅是覆盖了num的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。
场景二:
1 //try中有return,finally中有return 2 public class TryReturnFinally { 3 public static void main(String[] args) { 4 System.out.println(test()); 5 } 6 private static int test(){ 7 int num = 10; 8 try{ 9 System.out.println("try"); 10 return num += 80; 11 }catch(Exception e){ 12 System.out.println("error"); 13 }finally{ 14 if (num > 20){ 15 System.out.println("num>20 : " + num); 16 } 17 System.out.println("finally"); 18 num = 100; 19 return num; 20 } 21 } 22 }
run:
1 try 2 num>20 : 90 3 finally 4 100
总结:
流程是先运行try内部代码,判断finally中是否有return,
如果有,那么就不执行try中的return,继续执行finally中的代码
如果没有,那么先执行finally中代码,再执行try的return。
参考:
https://blog.csdn.net/yingshuanglu2564/article/details/82593916
https://www.jianshu.com/p/75a93408b5f8