Try、finally语句块内 有 return 的注意问题

本文通过四个具体案例探讨了Java中try-catch-finally结构中return语句的行为,特别是finally块如何影响方法的返回值。文章揭示了finally块中的return会覆盖try块中的return值,但如果finally块中没有return,则原始的返回值保持不变。

情况一:(最普通用法)

public class Test {

   public static void main(String[] args) {

        System.out.print(tt());                                                         

    }

   public static int tt() {

       int b = 23;

       try {

           System.out.println("yes");

           return b += 88;

       } catch(Exception e) {

           System.out.println("error     :      " + e);

       } finally {

           if (b > 25) {

               System.out.println("b>25     :      " + b);

           }

           System.out.println("finally");

       }

       return b;

    }

}

 

(开始)

yes

b>25     :      111

finally

111

(结束)

 

结论1 : 说明finally语句在return语句执行完了以后才执行的.

 

 

 

 

情况二:(finally中有return语句)

修finally部分

   public static int tt() {

       int b = 23;

       try {

           System.out.println("yes");

           return b += 88;

       } catch(Exception e) {

           System.out.println("error     :      " + e);

       } finally {

           if (b > 25) {

               System.out.println("b>25     :      " + b);

           }

           System.out.println("finally");

           return 100;

       }

       

    }

 

(开始)

yes

b>25     :      111

finally

100

(结束)

 

结论2:这样又说明了一个问题,finally语句块里面的return把原来的return给覆盖了,变成了新的返回值了.

 

 

 

 

 

 

 

 

 

情况三:(finally内改变返回值的value,但不返回)

继续修改

       publicstatic int tt() {

              intb = 23;

              try{

                     System.out.println("yes");

                     returnb;

              }catch (Exception e) {

                     System.out.println("error      :     " + e);

              }finally {

                     if(b > 25) {

                            System.out.println("b>25      :     " + b);

                     }

                     System.out.println("finally");

                     b = 100;

              }

              returnb;

       }

 

(开始)

yes

finally

23

出(结束)

 

结论3: 如果finally语句中没有返回语句覆盖的话,那么原来的返回值就不会变,不管你是不是改变了要返回的那个变量.

 

 

 

 

 

 

 

 

情况四:(在try、finally外,返回一个值,会不会改变try、finally内的返回值)

       publicstatic int tt() {

           int b = 23;

           try {

               System.out.println("yes");

               return b = 88;

           } catch(Exception e) {

               System.out.println("error : " +e);

           } finally {

               if (b > 25) {

                   System.out.println("b>25 :" + b);

               }

              System.out.println("finally");

           }

           return 100;

       }

 

(开始)

yes

b>25 : 88

finally

88

出(结束)

 

结论4 : 如果try、finally内已经有return,则外部的return不会起作用。

 

总结:

碰到try语句中的return,那么先把return的值放在某个池中,然后执行finally里面的代码块,

如果有返回值覆盖语句,就改变先前放在池中的那个值;

如果没有,就把那个池中的东西取出来返回出去。

 

简单来说就是

---------对待try、finally内有return语句的情况,只有在finally覆盖return,才会改变返回值。否则即使在最外层return新值,也不会改变原有的return值。

### Python `try` 和 `finally` 中都包含 `return` 语句的情况及执行顺序 在 Python 中,当 `try` 和 `finally` 中都存在 `return` 语句时,程序的执行顺序如下: - 首先执行 `try` 内的代码。一旦遇到 `return` 语句,该语句会被暂存起来,但并不会立即返回函数调用方。 - 接着控制权转移到 `finally` ,无论之前是否发生了异常或遇到了 `return` 语句,都会无条件地执行此部分的内容。 - 如果 `finally` 内也含有 `return` 语句,则会覆盖掉前面由 `try` 或者其他地方保存下来的任何即将要被返回的数据,并且此时才会真正地把新的值作为整个函数的结果传递给外部环境。 因此,在这种情况下,最终只会有一个来自 `finally` 的返回值传出去[^1]。 下面给出一段具体的例子来展示这一行为特性: ```python def example_function(): try: print("Executing inside the try block.") return "Return from try" finally: print("Executing inside the finally block.") return "Return from finally" if __name__ == "__main__": result = example_function() print(f"The function returned: {result}") ``` 运行上述代码将会输出: ``` Executing inside the try block. Executing inside the finally block. The function returned: Return from finally ``` 这表明即使 `try` 中有自己的 `return` 语句,只要 `finally` 同样定义了一个 `return` ,那么后者总是能够决定最后实际返回什么内容给外界。 值得注意的是,对于某些编程语言来说(比如 Java),它们可能有不同的处理机制;但对于 Python 而言,就是按照上面描述的方式来工作的[^2]。 #### 特殊情况说明 另外还需注意一点:如果 `try...except...else...finally` 结构中的任何一个分支已经包含了 `return` 操作,而之后又进入了带有自己 `return` 的 `finally` 分支,那么同样遵循前述原则——即以 `finally` 内部指定的那个为准[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值