Java学习第一百三十六部分——finally块执行时机
目录
一、前言简介
二、finally 块执行时机
三、finally 块在 `return` 之前执行示例
四、finally 块可以改变返回值吗?
五、finally 块的用途
六、总结归纳
一、前言简介
在 Java 中,`finally` 块是一个特殊的代码块,它通常与 `try` 和 `catch` 块一起使用,用于确保某些代码无论是否发生异常都会被执行。`finally` 块的执行时机非常关键,尤其是在涉及到 `return` 语句时。
二、finally 块执行时机
-
正常执行:当 `try` 块或 `catch` 块正常执行完毕后,`finally` 块会执行。
-
异常发生:当 `try` 块中发生异常且没有被 `catch` 块捕获时,`finally` 块仍然会执行。
-
return 语句:即使在 `try` 块或 `catch` 块中遇到 `return` 语句,`finally` 块也会在 `return` 之前执行。
-
`break`、`continue` 或 `throw` 语句:如果在 `try` 块或 `catch` 块中遇到 `break`、`continue` 或 `throw` 语句,`finally` 块也会在这些语句执行之前执行。
三、finally 块在 `return` 之前执行示例
public static int test() {try {return 1;} finally {System.out.println("finally"); // 先执行此行,再return}
}
执行流程:
1. `try` 块中的 `return 1;` 被执行。
2. 在 `return` 语句执行之前,`finally` 块会被调用。
3. `finally` 块中的 `System.out.println("finally");` 会被执行。
4. 最后,`return 1;` 的值被返回。
四、finally 块可以改变返回值吗?
疑惑解释
在 Java 中,`finally` 块不能直接改变 `return` 的值,但可以通过以下方式影响返回值:
-
修改变量:如果 `return` 语句返回的是一个变量的值,而这个变量在 `finally` 块中被修改,那么返回值可能会被改变。
-
抛出异常:如果在 `finally` 块中抛出异常,那么原本的 `return` 语句会被中断,异常会被抛出。
示例 1:修改变量
public static int test() {int result = 1;try {return result;} finally {result = 2; // 修改变量}
}
输出:返回值仍然是 `1`,因为 `return` 语句已经确定了返回值,`finally` 块中的修改不会影响已经确定的返回值。
示例 2:抛出异常
public static int test() {try {return 1;} finally {throw new RuntimeException("Exception in finally");}
}
输出:`RuntimeException` 被抛出,`return 1;` 的值不会被返回。
五、finally 块的用途
-
资源清理:关闭文件流、数据库连接等资源。
-
日志记录:记录方法的执行情况。
-
状态恢复:恢复某些状态,确保程序的稳定性。
六、总结归纳
-
`finally` 块会在 `try` 或 `catch` 块执行完毕后(无论是否发生异常)执行。
-
`finally` 块会在 `return` 语句之前执行,但不能直接改变 `return` 的值。
-
`finally` 块可以抛出异常,从而中断 `return` 的执行。