Java 中return 语句在try-catch-finally中的执行测试

网上有人做了一个例子,来说明return语句在try-catch-finally语句中的执行。这里就不贴原文了,只是简单说明一下:

 1 /* 情况1:没有exception发生,try 中的return 被finally中的return替换了。
 2 */
 3 public class test {
 4     public static void main (String[] args) {
 5         System.out.println("returnInTryCatchFinally() = " + returnInTryCatchFinally());
 6     }
 7 
 8     
 9     public static int returnInTryCatchFinally() {
10         
11         try {
12             return 1;
13                 
14         } catch (Exception e) {
15             System.out.println("in catch");
16             return 2;
17         } finally {
18             System.out.println("in finally");
19             return 3;
20         }
21     
22     }
23 }
24 
25 /* 输出:
26 in finally
27 returnInTryCatchFinally() = 3
28 */
 1 /* 情况2:exception发生,catch 中的return 被finally中的return替换了。
 2 */
 3 public class test {
 4     public static void main (String[] args) {
 5         System.out.println("returnInTryCatchFinally() = " + returnInTryCatchFinally());
 6     }
 7 
 8     
 9     public static int returnInTryCatchFinally() {
10         
11         try {
12             long a = 1/0;
13                 
14         } catch (Exception e) {
15             System.out.println("in catch");
16             return 2;
17         } finally {
18             System.out.println("in finally");
19             return 3;
20         }
21     
22     }
23 }
24 
25 /* 输出:
26 in catch
27 in finally
28 returnInTryCatchFinally() = 3
29 */

 

说实话,开始的时候我信了,感觉就是Java会判断finally中有return语句,所以不会执行try/catch中的return。但仔细想想,如果return中有计算呢?我们来试一下:

 1 public class myClass {
 2     public static void main (String[] args) {
 3         System.out.println("returnInTryCatchFinally() = " + returnInTryCatchFinally());
 4     }
 5     
 6     
 7     public static int returnInTryCatchFinally() {
 8         int var = 0;
 9         try {
10             System.out.println("in try, var = " + var);
11             //long a = 1/0;
12             return var += 100;
13             
14         } catch (Exception e) {
15             System.out.println("in catch, var = " + var);
16             return var += 10;
17         } finally {
18             System.out.println("in finally, var = " + var);
19             return var += 1;
20         }
21     }
22 }
23 /* 输出:
24 in try, var = 0
25 in finally, var = 100
26 returnInTryCatchFinally() = 101
27 */
 1 public class myClass {
 2     public static void main (String[] args) {
 3         System.out.println("returnInTryCatchFinally() = " + returnInTryCatchFinally());
 4     }
 5     
 6     
 7     public static int returnInTryCatchFinally() {
 8         int var = 0;
 9         try {
10             System.out.println("in try, var = " + var);
11             long a = 1/0;
12             //return var += 100;
13             
14         } catch (Exception e) {
15             System.out.println("in catch, var = " + var);
16             return var += 10;
17         } finally {
18             System.out.println("in finally, var = " + var);
19             return var += 1;
20         }
21     }
22 }
23 /* 输出:
24 in try, var = 0
25 in catch, var = 0
26 in finally, var = 10
27 returnInTryCatchFinally() = 11
28 */

所以其实return语句并不是被替换或跳过了,只不过即使在try/catch总有return语句,其执行之后还是会执行finally中的语句。

 

 

posted on 2013-05-08 23:57  name2579  阅读(1051)  评论(2编辑  收藏  举报

导航