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中的语句。