0

0

在Java里finally和try谁先执行_执行流程顺序解析

P粉602998670

P粉602998670

发布时间:2025-12-18 17:31:02

|

667人浏览过

|

来源于php中文网

原创

finally总在try或catch执行完后、方法返回前执行,无论是否异常或return;若finally含return则覆盖原返回值;System.exit()等极少数情况不执行。

在java里finally和try谁先执行_执行流程顺序解析

在Java中,try块先执行finally块在try(或catch)执行完毕后、方法返回前执行——但要注意:它不“插队”,而是严格遵循控制流的退出时机。

try和finally的基本执行顺序

Java规定,只要进入了try语句块(哪怕只执行了一行),无论是否发生异常、是否执行了return、break或continue,只要该try对应的finally存在且未被JVM强制终止(如System.exit()),finally一定会被执行,且是在try或catch语句全部执行完之后、控制权交还给调用方之前运行。

  • 正常流程:try → finally → 方法后续代码(或返回)
  • 抛异常但被catch:try(到异常处)→ catch → finally → 方法后续代码(或返回)
  • 抛异常未被catch:try(到异常处)→ finally → 异常向上抛出
  • try中有return:return表达式先计算并暂存结果 → finally执行 → 再真正返回(注意:若finally里也有return,会覆盖原返回值)

finally在return之后“插手”的真实含义

很多人误以为“finally在return之后执行”意味着return已经完成。实际上,return不是瞬间完成的动作,它包含两个阶段:① 计算返回值并暂存;② 跳转离开当前方法。finally就插在这两个阶段之间。

例如:

立即学习Java免费学习笔记(深入)”;

DreamStudio
DreamStudio

SD兄弟产品!AI 图像生成器

下载
public static int test() {
    try {
        return 1;
    } finally {
        System.out.println("finally run");
        // 此处若写 return 2; 就会覆盖原来的1
    }
}

输出是"finally run",返回值是1;但如果finally里也写return 2,最终返回的就是2——因为finally的return会中断原返回流程,直接跳转出去。

哪些情况finally不会执行?

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

  • JVM退出:如调用System.exit()
  • 线程被强制中断(Thread.stop(),已废弃,但极端情况下可能影响)
  • finally所在代码段根本没进入:比如try之前就抛出了Error(如StackOverflowError),且未被外层捕获
  • 死循环或无限等待卡在try/catch中,程序未退出,finally自然也不会触发

实际开发中的关键提醒

不要在finally里修改返回值,除非你明确需要覆盖逻辑(比如日志兜底、资源强制重置);更不要在finally里抛出新异常——它会吞掉原异常,导致问题难以排查。

释放资源(如关闭IO流、数据库连接)是finally的经典用途,但自Java 7起,优先推荐使用try-with-resources语法,它更简洁且能自动处理资源关闭,底层仍依赖类似finally的机制。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

100

2025.12.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

390

2023.06.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.4万人学习

Java 教程
Java 教程

共578课时 | 82.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号