Java finally什么时候执行_Java finally语句执行时机解析

发布时间 - 2025-12-27 00:00:00    点击率:
finally块必定执行,除非JVM提前退出;它在return后执行但不改变已确定的返回值,典型用途是资源清理而非修正返回值。

finally 块在 try-catch 结构结束前**必定执行**,无论是否发生异常、是否被 catch 捕获、甚至在 try 或 catch 中用了 return,只要 try 语句块开始执行了,对应的 finally 就会执行(除非 JVM 直接退出)。

finally 在 return 之后执行,但不会改变已确定的返回值

很多人误以为 finally 里的 return 会覆盖前面的 return,其实不然。Java 的规则是:如果 try 或 catch 中有 return,JVM 会先记录下要返回的值(基本类型是值本身,引用类型是引用地址),然后去执行 finally;finally 执行完后,再把之前记下的值真正返回。

  • try 中 return 5;finally 修改了变量 x = 10 → 最终仍返回 5
  • try 中 return new StringBuilder("a");finally 调用 sb.append("b") → 返回对象内容变为 "ab"(因为是引用,对象被修改了)
  • finally 里也写 return 3 → 这个 return 会生效,直接返回 3,覆盖之前的逻辑(不推荐这么写,容易掩盖问题)

哪些情况 finally 不会执行?

绝大多数情况下 finally 都会跑,但以下几种例外:

  • JVM 在 try/catch 执行前就崩溃或被强制终止(如调用 System.exit(0))
  • 线程被 kill(如 Thread.stop(),已废弃但理论上存在)
  • 发生 StackOverflowError 或 OutOfMemoryError 等严重错误,且未被捕获(取决于 JVM 实现和错误时机)
  • try 块还没来得及执行,比如方法刚进入就抛出异常(但此时连 try 都没进,自然没有对应的 finally)

finally 的典型用途

它不是用来“修正返回值”的,而是为资源清理而生:

  • 关闭文件流、数据库连接、Socket、锁(Lock.unlock())等必须释放的资源
  • 恢复现场,比如重置标志位、还原线程局部变量(ThreadLocal)
  • 日志记录:不管成功失败,都记一笔“操作结束”

基本上就这些。理解 finally 的执行时机,关键记住一点:它是 try-catch 生命周期的“收尾动作”,不是“兜底逻辑”。


# java  # app  # overflow 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  韩国服务器如何优化跨境访问实现高效连接?  如何快速搭建高效简练网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  米侠浏览器网页背景异常怎么办 米侠显示修复  如何快速使用云服务器搭建个人网站?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  制作企业网站建设方案,怎样建设一个公司网站?  Laravel如何使用Eloquent进行子查询  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  利用vue写todolist单页应用  高端网站建设与定制开发一站式解决方案 中企动力  详解jQuery中的事件  Android滚轮选择时间控件使用详解  公司网站制作价格怎么算,公司办个官网需要多少钱?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何快速生成橙子建站落地页链接?  香港网站服务器数量如何影响SEO优化效果?  ,在苏州找工作,上哪个网站比较好?  如何在IIS中新建站点并配置端口与IP地址?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Android仿QQ列表左滑删除操作  Laravel如何创建自定义Facades?(详细步骤)  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何快速重置建站主机并恢复默认配置?  微信小程序 闭包写法详细介绍  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  JavaScript如何实现音频处理_Web Audio API如何工作?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  用v-html解决Vue.js渲染中html标签不被解析的问题  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  七夕网站制作视频,七夕大促活动怎么报名?  微信公众帐号开发教程之图文消息全攻略  Laravel如何发送系统通知?(Notification渠道示例)  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  专业商城网站制作公司有哪些,pi商城官网是哪个?  javascript中闭包概念与用法深入理解  如何生成腾讯云建站专用兑换码?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  北京的网站制作公司有哪些,哪个视频网站最好?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何在搬瓦工VPS快速搭建网站?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  深入理解Android中的xmlns:tools属性  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧