try catch finally,try里有return,finally还执行么?

本文探讨了Java中finally块的执行特性,即使在try或catch中有return语句,finally块的代码依然会执行。此外,返回值在finally执行前已确定,finally中包含return可能导致返回值改变并提前退出函数。示例代码展示了类型转换错误和变量提升的知识点。
执行,并且finally的执行早于try里面的return
import static java.lang.Math.*;
public class Test{
public static void main(String[] args){
//System.out.println(Math.sin(20));传统做法
System.out.println(sin(20));
}
}
byte a = 127;
byte b = 127;
b = a + b; // 报编译错误:cannot convert from int to byte
b += a;
short s1= 1;
s1 = s1 + 1;
short s1= 1;
s1 += 1;
阿里内部资料结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当trycatch中有return时,finally仍然会执行;
3finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的
值保存起来,管fifinally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数
返回值是在fifinally执行前确定的;
4finally中最好不要包含return,否则程序会提前退出,返回值不是trycatch中保存的返回值。
<think> 我们参考了多个引用资料,这些资料都明确说明了在try-catch语句中,即使try块中有return语句,finally块仍然会执行。 具体执行顺序如下: 1. 执行try块中的语句,包括return后面的表达式(计算返回值并保存在临时变量中,但此时并不立即返回)。 2. 如果有异常,执行catch块中的语句,同样包括return后面的表达式(计算并保存返回值)。 3. 然后执行finally块中的语句。 4. 如果finally块中没有return语句,则最后会执行trycatch中的return(将之前保存的临时变量值返回)。 5. 如果finally块中有return语句,则finally中的return会覆盖之前trycatch中保存的返回值,并提前返回。 因此,finally块中的代码总是会执行(除非在trycatch中调用了System.exit()等方法导致程序退出)。 下面我们通过一个例子来说明: 假设有以下代码: ```java public class FinallyExample { public static void main(String[] args) { System.out.println(test()); } public static int test() { try { System.out.println("try block"); return 1; } finally { System.out.println("finally block"); } } } ``` 输出结果为: ``` try block finally block 1 ``` 这说明finally块在tryreturn之前执行。 再考虑finally中有return的情况: ```java public class FinallyExample2 { public static void main(String[] args) { System.out.println(test()); } public static int test() { try { System.out.println("try block"); return 1; } finally { System.out.println("finally block"); return 2; } } } ``` 输出结果为: ``` try block finally block 2 ``` 此时,finally中的return覆盖了try中的返回值。 因此,我们可以得出结论:try块中有return时,finally块仍然会执行。如果finally中也有return,则会覆盖之前的返回值;如果没有,则返回之前保存的值。 引用资料[1][3][4]都支持了这一结论。 </think>在`try-catch-finally`语句中,**当`try`块中有`return`语句时,`finally`块仍然会执行**。这是Java等语言的标准行为,具体执行流程如下: ### 执行顺序与规则 1. **`try`块执行** 先执行`try`块中的代码,包括`return`后的表达式(返回值会被**临时存储**,但此时不返回)。 ```java try { System.out.println("执行try"); return 1; // 计算返回值=1,暂存结果 } ``` 2. **`finally`块执行** 无论`try`中是否有`return`或异常,`finally`块**必定执行**(除非程序崩溃或`System.exit()`)。 ```java finally { System.out.println("执行finally"); } ``` 3. **最终返回** - 若`finally`中无`return`:返回`try`或`catch`中**暂存的值**(即使`finally`修改了相关变量,也不影响已暂存的值)。 - 若`finally`中有`return`:**覆盖**之前的返回值,直接返回`finally`中的值。 --- ### 关键示例说明 #### 示例1:`finally`不修改返回值 ```java public static int test() { int i = 0; try { return i; // 暂存 i=0 } finally { i = 1; // 修改i,但已暂存的值不受影响 } } // 返回结果:0 ``` > **原因**:`return i`已计算并暂存结果`0`,`finally`修改变量`i`不影响已暂存的值[^4]。 #### 示例2:`finally`覆盖返回值 ```java public static int test() { try { return 1; } finally { return 2; // 覆盖try中的返回值 } } // 返回结果:2 ``` > **原因**:`finally`中的`return`优先级更高,直接返回新值[^3][^4]。 #### 示例3:含异常的流程 ```java try { throw new Exception(); } catch (Exception e) { return 3; // 暂存返回值3 } finally { System.out.println("finally执行"); } // 输出"finally执行",返回3 ``` > **说明**:`catch`中的`return`同样会暂存返回值,之后执行`finally`[^1][^2]。 --- ### 总结 | 场景 | `finally`是否执行 | 返回值 | |-------------------------------|-------------------|----------------------| | `try`中有`return` | ✅ 是 | 暂存的值(若无覆盖) | | `try`和`finally`均有`return` | ✅ 是 | `finally`中的值 | | `catch`中有`return` | ✅ 是 | 暂存的值(若无覆盖) | | `finally`中修改返回值变量 | ✅ 是 | **不影响**已暂存的值 | > ⚠️ 最佳实践:**避免在`finally`中使用`return`**,否则会掩盖`try/catch`中的异常或预期返回值[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值