Java finally语句到底是在return之前还是之后执行?---第一篇

当return遇到finally

看过网上关于Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行的讨论也有很多。

首先明确一点,下面两种情况finally肯定是不执行的:
1). return语句在try之前,还没执行就返回了,当然不执行。
2). try语句中用了system.exit(0)强制退出JVM,暴力退出当然也不会执行。

先来看下面的代码

package com.loongshaw;

public class TryReturnFinally {

     public static void main(String[] args) {

         System.out.println(test1());        
     }

     public static int test1() {

         int b = 1;

         try {           
             System.out.println("try block");           
             return ++b;             
         }
         catch (Exception e) {           
             b = 10;
             System.out.println("catch block");
         }
         finally {              
             ++b;
             System.out.println("finally block");
         }       
         System.out.println("last block");
         return b;
     }
}

如果你觉得其执行结果是3,那么请你继续看下去,中招了吧,哈哈。
先看看执行结果吧:

try block
finally block
2

可以看出,上面代码的执行结果是2。常规想法其finally也执行了,try中也执行了,明明执行了两个++b呢,咋回事呢?

这个时候,咱打断点看看:
(1). 当程序执行到try中的return语句时,这时b还是1.
这里写图片描述
(2). 接着程序执行到finally语句时,执行了++b,b变为2.
这里写图片描述
(3). 这时,我们点击try…return中的b,发现其值变为2.
这里写图片描述

以上结果说明了一点:return语句执行了,然后再执行了finally语句,但是return语句并没有直接返回,而是待finally语句执行完了再返回。

通过下面这个测试用例加强理解:

package com.loongshaw;

public class TryReturnFinally {

     public static void main(String[] args) {
         System.out.println(test2());
     }

     public static String test2() {

         try {

             System.out.println("try block");           
             return test3();             
         }
         catch (Exception e) {

             System.out.println("catch block");
         }
         finally {

             System.out.println("finally block");
         }

         System.out.println("last block");
         return "last block";
     }

     public static String test3() {                      
         System.out.println("return block");
         return "output return block";
     }

}

执行结果:

try block
return block
finally block
output return block

通过上述结果可以得出,在执行try语句中的return时,其test3()方法是被执行了的,其返回值保存在一个临时变量中,然后去执行finally语句。

 try {           
       System.out.println("try block");         
       return test3();           
    }

最后输出存进临时变量返回值。

output return block

可能大家会继续说,如果finally和catch中有return,那是一种什么情况:
(1) 首先看catch中有return

 public static int test4() {

         int b = 1;

         try {

             System.out.println("try block");           
             return b/0; 

         }
         catch (Exception e) {
             System.out.println("catch block");
             return ++b;
         }
         finally {

             b = b+ 10;
             System.out.println("finally block");
         }
     }

结果

try block
catch block
finally block
2

可见,catch中的return与try一样,finally都会执行,但是不影响try和catch中的return结果。

(2) 然后看finally中有return

public static int test5() {

         int b = 1;

         try {

             System.out.println("try block");           
             return ++b; 

         }
         catch (Exception e) {

             ++b;
             System.out.println("catch block");
             return b;
         }
         finally {

             b = b+ 10;
             System.out.println("finally block");
             return b;
         }
     }

结果

try block
finally block
12

可见,finally中的return直接返回了,这与try和catch中的return是不同的。


大家可能发现test1()方法最后的return是没有执行的,是不是。

public static int test1() {  
    ...    
    System.out.println("last block");
    return b;
    ...
}

通常情况是不会执行的,除非触发了catch。下面是修改后的片段代码:

 public static int test1() {

         int b = 1;

         try {

             b = b/0;
             System.out.println("try block");           
             return ++b; 

         }
         catch (Exception e) {

             b = 10;
             System.out.println("catch block");
         }
         finally {

             b = b+ 10;
             System.out.println("finally block");
         }

         System.out.println("last block");
         return b;
     }

执行结果:

 catch block
finally block
last block
20

通过上述结果可以得出,在catch触发时,最外层的return是会被执行的。

总结:

  1. finally语句在try和catch语句中的return执行后、返回前执行;
  2. 若finally语句中没有return,则其执行结果不影响try和catch中已确定的返回值;
  3. 若finally语句中有return,则其执行后的结果会直接返回。
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个Java try-catch的示例: ```java public class Example { public static void main(String[] args) { try { // 尝试执行可能会出现异常的代码 int result = 10 / 0; // 这里会抛出一个 ArithmeticException 异常 } catch (ArithmeticException e) { // 捕获并处理 ArithmeticException 异常 System.out.println("出现了一个算术异常:" + e.getMessage()); } finally { // finally 块中的代码总是会执行,无论是否出现了异常 System.out.println("这是 finally 块中的代码"); } } } ``` 在这个示例中,我们在try块中尝试执行一个除以0的操作,这会抛出一个ArithmeticException异常。我们使用catch块来捕获并处理这个异常,打印出异常信息。同时,我们还使用finally块来执行一些无论是否出现异常都需要执行的代码,例如清理资源等等。 ### 回答2: Java的try-catch语句是用于处理异常的一种机制。它的主要作用是在程序执行过程中捕获可能发生的异常,并对异常进行相应的处理。下面是一个简单的Java try-catch示例: ```java public class TryCatchExample { public static void main(String[] args) { try { int[] numbers = {1, 2, 3}; System.out.println(numbers[4]); // 此处访问数组越界,可能抛出ArrayIndexOutOfBoundsException异常 } catch (ArrayIndexOutOfBoundsException e) { System.out.println("捕获到数组越界异常:" + e.getMessage()); // 对异常进行捕获和处理 } finally { System.out.println("无论是否发生异常,都会执行的代码"); } } } ``` 上面的示例中,try块中的代码尝试访问了一个数组的第5个元素,但是该数组只有3个元素,因此会抛出ArrayIndexOutOfBoundsException异常。在catch块中,我们捕获到了异常,并输出了相应的错误信息。无论是否发生异常,finally块中的代码都会执行,这在这个示例中用来输出一条无论如何都会执行的信息。 通过使用try-catch语句,我们可以更好地控制程序运行过程中的异常情况,从而避免程序的崩溃,提高程序的健壮性。在实际开发中,我们可以根据具体的业务需求编写相应的try-catch块,以处理可能出现的各种异常情况。 ### 回答3: Java中的try-catch语句用于捕获和处理可能会引发异常的代码。它允许我们在程序执行过程中处理异常情况,从而确保程序的稳定性和可靠性。 下面是一个Java try-catch的示例: ``` try { // 可能引发异常的代码 int result = divide(10, 0); // 假设这是一个除法操作,分母为0会引发异常 System.out.println("结果:" + result); } catch (ArithmeticException e) { // 捕获并处理异常 System.out.println("出现了算术异常:除数不能为0"); e.printStackTrace(); } // 定义了一个除法方法 public static int divide(int num1, int num2) { return num1 / num2; } ``` 在这个示例中,我们使用try块来执行可能引发异常的代码。在try块内部,我们调用了一个divide方法来执行除法操作。如果分母为0,会引发一个ArithmeticException算术异常。 当异常被引发时,程序会立即跳转到catch块。在catch块中,我们捕获到了ArithmeticException异常,并打印出异常信息。通过这种方式,我们可以在程序出现异常时,提供相应的处理方法,避免它导致程序崩溃。 需要注意的是,try-catch语句是按照顺序执行的。如果在前面的catch块中捕获到异常并处理了,后续的catch块将不会再执行。因此,需要根据具体的异常情况进行合理的异常处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值