try-catch-finally语句中有return语句时的执行情况

本文详细解析了Java中try-catch-finally语句块的执行顺序及return语句的位置对其的影响。探讨了不同情况下return语句的执行时机,并通过示例代码展示了finally块中的操作如何影响catch块中的返回值。

try中没有异常 的情况下try、catch、finally的执行顺序 try --- finally
如果try中有异常,执行顺序是try --- catch --- finally
如果 try中没有异常 并且 try中有return这时候正常执行顺序是try ---- finally --- return
如果 try中有异常 并且 try中有return这时候正常执行顺序是try----catch---finally--- return
总之 finally 永远执行!
try-catch-finally里都没有return ,finally 之后有个return , 如果try中有异常 finally执行完后,还能执行return吗?那是不可能执行的了,try中有异常以后,根据java的异常机制先执行catch后执行finally,此时错误异常已经抛出,程序因异常而终止 所以你的return是不会执行的
 
    在存在try-catch-finally的方法中,return可能出现的位置有4个,在try中,在catch中,在finally中,在finally后(try-catch-finally外的语句块)。

    在这4个位置都出现return的情况下(事实上应该是不可能的,如果前面3个位置都存在return,那么最后一个位置的return就成了unreachable code,编译不会通过),最终会执行的return应该是finally中的return。也就是finally中的return会覆盖掉其它位置的return
try中有return语句

-------- try catch finally顺序:
1.try {}.
2.如果有Error Exception则,执行catch(){}中的代码。
3.无论有没有 Error Exception都要执行finally{}中的代码。
4.执行 try 中的 return

catch中有return

 但当finally中不存在return,而catch中存在return,但finally中的语句又会对catch中的return的值产生影响时,情况就有点复杂。

int ret = 0;
try{
throw new Exception();
}
catch(Exception e){
ret = 1;
return ret;
}
finally{
ret = 2;
}
这里finally中没有return,但是将catch中要return的ret赋值为2.那么 最后返回的值是1 . 为什么?
从调试中可以知道Finally中的赋值语句的确被执行了,而执行完这条finally语句后的下一条语句就是catch中的return,那么为啥返回的是1呢?
catch中有return,finally中没有return,return的值在执行finally之前已经确定下来了。
另一个值得注意的是最后的return(位于try-catch-finally外)并没有被执行。

在一般情况下,`try-catch-finally` 语句中的 `finally` 块会执行。具体如下: - 若 `try` 块中的代码未引发异常,`catch` 块将被跳过,接着执行 `finally` 块。 - 若 `try` 块中的代码引发了异常,相应的 `catch` 块会被执行,无论是否有匹配的 `catch` 块,`finally` 块都将被执行- 若在 `try` 或 `catch` 块中有 `return` 语句,`finally` 块仍然会在方法返回之前被执行。 不过,`finally` 块也存在不执行情况。例如当 Java 虚拟机提前退出,`finally` 块将不会执行,像调用 `System.exit(0)` 这种情况。 以下为不同情况的示例代码: #### 无异常情况 ```java public class FinallyExample { public static void main(String[] args) { try { System.out.println("Try block executed"); } catch (Exception e) { System.out.println("Catch block executed"); } finally { System.out.println("Finally block executed"); } } } ``` 上述代码中,`try` 块无异常,`catch` 块跳过,`finally` 块执行。 #### 有异常情况 ```java public class FinallyExampleWithException { public static void main(String[] args) { try { int result = 1 / 0; System.out.println("Try block executed"); } catch (ArithmeticException e) { System.out.println("Catch block executed"); } finally { System.out.println("Finally block executed"); } } } ``` 此代码中,`try` 块出现异常,进入 `catch` 块,之后 `finally` 块执行。 #### `try` 块有 `return` 语句情况 ```java public class FinallyWithReturnInTry { public static int test() { try { return 1; } catch (Exception e) { return 0; } finally { System.out.println("Finally block executed"); } } public static void main(String[] args) { int result = test(); System.out.println("Result: " + result); } } ``` 这里 `try` 块有 `return` 语句,但 `finally` 块仍在方法返回前执行。 #### `System.exit(0)` 情况 ```java public class FinallyNotExecuted { public static void main(String[] args) { try { System.exit(0); System.out.println("Try block executed"); } catch (Exception e) { System.out.println("Catch block executed"); } finally { System.out.println("Finally block executed"); } } } ``` 由于调用了 `System.exit(0)`,`finally` 块不会执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值