在try语句块中return,还会继续执行finally语句块中的语句么

本文通过两个示例探讨了Java中finally块的执行机制。首先分析了在try块内使用return的情况下finally块是否能够得到执行;其次研究了当try块内调用System.exit(0)时finally块的执行情况。

1.首先尝试在try中return,看finally是否能执行到,测试代码如下:

public class FinallyTest {
结果是:

public String returnString() {

String str;
try {
str = "Hello, William";
System.out.println("This is try block.");
return str;
}
catch(Exception e) {
System.out.println("This is catch block.");
}
finally {
System.out.println("This is finally block.");
}
return null;
}

}

This is try block.
This is finally block.

可见不管try里是否有return,finally最终仍会执行到。

2.但是在try中System.exit(0),finally还会不会执行呢?还是来段测试代码,如下:

public class FinallyTest1 {
结果是:

 public static String returnString() {
 
  String str;
  try {
   str = "This is try block.";
   System.out.println(str);
   System.exit(0);
  }
  catch(Exception e) {
   System.out.println("This is catch block.");
  }
  finally {
   System.out.println("This is finally block.");
  }
  return null;
 }

}

This is try block.

可见,这种情况下,finally还未被执行,程序就退出了。碰到这种情况,如果还想在程序退出之前执行一些代码,可以参见addShutdownHook这个函数。

总结:return之前没有System.exit() ;之类的直接让应用停下来的代码的话, finally中的代码就会执行 并且是在return之前执行

<think> 我们参考了多个引用资料,这些资料都明确说明了在try-catch语句中,即使try块中有return语句finally块仍然会执行。 具体执行顺序如下: 1. 执行try中的语句,包括return后面的表达式(计算返回值并保存在临时变量中,但此时并不立即返回)。 2. 如果有异常,执行catch块中的语句,同样包括return后面的表达式(计算并保存返回值)。 3. 然后执行finally中的语句。 4. 如果finally块中没有return语句,则最后会执行try或catch中的return(将之前保存的临时变量值返回)。 5. 如果finally块中有return语句,则finally中的return会覆盖之前try或catch中保存的返回值,并提前返回。 因此,finally中的代码总是会执行(除非在try或catch中调用了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、付费专栏及课程。

余额充值