测试环境 JDK1.8
1. catch中包含return
//有return的时候 输出13423 //无return的时候 输出134234 public class Trycatch { public static String output = ""; public static void main(String[] args) { foo(0); foo(1); System.out.println(output); } private static void foo(int i) { try { if(i==1){ throw new Exception(); } output += "1"; } catch (Exception e) { output += "2"; //return; }finally{ output += "3"; } output += "4"; } }
2. try中有return,finally里无return
public class Trycatch2 { public static void main(String[] args) { int k = test(); System.out.println(k); } public static int test() { int a = 0; try { a = 1; return a; } finally { System.out.println("It is in final chunk"); a = 2; //return a; } } } //输出结果 It is in final chunk 1
3. try中有return,finally里也有return
public class Trycatch2 { public static void main(String[] args) { int k = test(); System.out.println(k); } public static int test() { int a = 0; try { a = 1; return a; } finally { System.out.println("It is in final chunk"); a = 2; return a; } } } //输出结果 It is in final chunk 2
2和3的解析
解析2
当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序,
在执行`a = 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,
这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。
解析3
finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.