finally 总会执行,无论 try 中是否发生异常或 return:执行顺序为 try → finally → 后续代码;return 会暂存结果再执行 finally,其内的 return 或 throw 会覆盖原返回值或异常。

当 try 块中没有发生异常时,finally 仍会正常执行——这是 finally 的核心设计目的:无论是否抛出异常、是否 return、是否 break,只要进入 try(或对应的 try-with-resources),就一定会执行其配对的 finally。
执行顺序很明确
在无异常情况下,流程是:try → finally → (后续代码)。注意,finally 总在 try 结束后、函数返回前运行(除非 JVM 强制退出等极端情况)。
return 语句不会跳过 finally
即使 try 中有 return,程序也不会直接退出方法,而是先暂存返回值,然后执行 finally,最后再返回。
- 如果 finally 中没有 return 或 throw,原返回值不变
- 如果 finally 中有 return,它会覆盖 try 中的返回值(不推荐这种写法)
- 如果 finally 中抛出异常,它会“吃掉” try 中的返回值,直接向上抛出新异常
常见误区提醒
有人误以为“没异常就不走 finally”,其实不然。例如:
(伪代码示意)try {
System.out.println("执行 try");
return "from try";
} finally {
System.out.println("finally 总会执行");
}
输出一定是:
执行 try
finally 总会执行
然后才返回 "from try"。
实际建议
- 把资源清理、状态重置、日志记录等必须执行的操作放在 finally 中
- 避免在 finally 中写 return 或 throw,以防掩盖逻辑或干扰返回行为
- 若需区分“有无异常”,可用布尔标志变量,或改用 try-catch-finally 并在 catch 中设标记










