try catch中的finally代码一定会执行吗?

1.正常情况

正常运行的情况下,finally 中的代码是一定会执行的,但是,如果遇到以下异常情况,那么 finally 中的代码就不会继续执行了:

  1. 程序在 try 块中遇到 System.exit() 方法,会立即终止程序的执行,这时 finally 块中的代码不会被执行,例如以下代码:

public class FinallyExample {public static void main(String[] args) {try {System.out.println("执行 try 代码.");System.exit(0);} finally {System.out.println("执行 finally 代码.");}}
}

以上程序的执行结果如下:

图片

  1. 在 try 快中遇到 Runtime.getRuntime().halt() 代码,强制终止正在运行的 JVM。与 System.exit()方法不同,此方法不会触发 JVM 关闭序列。因此,当我们调用 halt 方法时,都不会执行关闭钩子或终结器。实现代码如下:

public class FinallyExample {public static void main(String[] args) {try {System.out.println("执行 try 代码.");Runtime.getRuntime().halt(0);} finally {System.out.println("执行 finally 代码.");}}
}

以上程序的执行结果如下:

图片

  1. 程序在 try 块中遇到无限循环或者发生死锁等情况时,程序可能无法正常跳出 try 块,此时 finally 块中的代码也不会被执行。

  2. 掉电问题,程序还没有执行到 finally 就掉电了(停电了),那 finally 中的代码自然也不会执行。

  3. JVM 异常崩溃问题导致程序不能继续执行,那么 finally 的代码也不会执行。

2.分析

正常运行的情况下,finally 中的代码是一定会执行的,但是,如果遇到 System.exit() 方法或 Runtime.getRuntime().halt() 方法,或者是 try 中发生了死循环、死锁,遇到了掉电、JVM 崩溃等问题,那么 finally 中的代码也是不会执行的。

3.知识扩展

钩子方法解释

在编程中,钩子方法(Hook Method)是一种由父类提供的空或默认实现的方法,子类可以选择性地重写或扩展该方法,以实现特定的行为或定制化逻辑。钩子方法可以在父类中被调用,以提供一种可插拔的方式来影响父类的行为。钩子方法通常用于框架或模板方法设计模式中。框架提供一个骨架或模板,其中包含一些已经实现的方法及预留的钩子方法。具体的子类可以通过重写钩子方法来插入定制逻辑,从而影响父类方法的实现方式。

实现方法

System.exit() 和 Runtime.getRuntime().halt() 都可以用于终止 Java 程序的执行,但它们之间有以下区别:

  1. System.exit():来自 Java.lang.System 类的一个静态方法,它接受一个整数参数作为退出状态码,通常非零值表示异常终止,使用零值表示正常终止。其中,最重要的是使用 exit() 方法,会执行 JVM 关闭钩子或终结器。

  2. Runtime.getRuntime().halt():来自 Runtime 类的一个实例方法,它接受一个整数参数作为退出状态码。其中退出状态码只是表示程序终止的原因,很少在程序终止时使用非零值。而使用 halt() 方法,不会执行 JVM 关闭钩子或终结器。

例如以下代码,使用 exit() 方法会执行 JVM 关闭钩子:

class ExitDemo {// 注册退出钩子程序static {Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("执行 ShutdownHook 方法");}));}public static void main(String[] args) {try {System.out.println("执行 try 代码。");// 使用 System.exit() 退出程序System.exit(0);} finally {System.out.println("执行 finally 代码。");}}
}

以上程序的执行结果如下:

图片

而 halt() 退出的方法,并不会执行 JVM 关闭钩子,示例代码如下:

class ExitDemo {// 注册退出钩子程序static {Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("执行 ShutdownHook 方法");}));}public static void main(String[] args) {try {System.out.println("执行 try 代码。");// 使用 Runtime.getRuntime().halt() 退出程序Runtime.getRuntime().halt(0);} finally {System.out.println("执行 finally 代码。");}}
}

以上程序的执行结果如下:

图片

小结

正常运行的情况下,finally 中的代码是一定会执行的,但是,如果遇到 System.exit() 方法或 Runtime.getRuntime().halt() 方法,或者是 try 中发生了死循环、死锁,遇到了掉电、JVM 崩溃等问题,finally 中的代码是不会执行的。而 exit() 方法会执行 JVM 关闭钩子方法或终结器,但 halt() 方法并不会执行钩子方法或终结器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes(K8S)集群部署实战

目录 一、准备工作1.1、创建3台虚拟机1.1.1、下载虚拟机管理工具1.1.2、安装虚拟机管理工具1.1.3、下载虚Centos镜像1.1.4、创建台个虚拟机1.1.5、设置虚拟机网络环境 1.2、虚拟机基础配置(3台虚拟机进行相同处理)1.2.1、配置host1.2.2、关闭防火墙1.2.3…

Codeforces Round 921 (Div. 2)题解(A-C)

A We Got Everything Covered! 思路 可以采用划分区域的思想。 共划分为 n 个区域每一个区域含有所包含的前 k 个字母 证明: 正确性:无论所要求的字符串str为什么,只需要在区域i中取出 s t r [ i ] str[i] str[i]即可最优性&#xff1a…

构造题记录

思路&#xff1a;本题要求构造一个a和b数组相加为不递减序列&#xff0c;并且b数组的极差为最小的b数组。 可以通过遍历a数组并且每次更新最大值&#xff0c;并使得b数组为这个最大值和当前a值的差。 #include <bits/stdc.h> using namespace std; #define int long lon…

【BUUCTF 加固题】Ezsql 速通

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

阿里云/腾讯云幻兽帕鲁服务器据点最大帕鲁工作数量最多15个,改成20不生效?

例如&#xff0c;在阿里云的计算巢管理中&#xff0c;找到你的这台部署幻兽帕鲁的服务器实例&#xff0c;选择右上角的“修改游戏配置” 然后选择“基地内工作帕鲁的最大数量”改成20 有人说更改上面的数字&#xff0c;根本不起作用。原因可能如下&#xff1a; 参考资料&#…

SORA:OpenAI最新文本驱动视频生成大模型技术报告解读

Video generation models as world simulators&#xff1a;作为世界模拟器的视频生成模型 1、概览2、Turning visual data into patches&#xff1a;将视觉数据转换为补丁3、Video compression network&#xff1a;视频压缩网络4、Spacetime Latent Patches&#xff1a;时空潜在…

C++学习:最值查找

min和max函数 1.min(a&#xff0c;b)返回a和b中较小的那个值&#xff0c;只能传入两个值&#xff0c;或传入一个列表。 例如: min(3&#xff0c;5) 3 min({1,2,3,4})1 2.max(a&#xff0c;b)返回a和b中较大的那个值&#xff0c;只能传入两个值&#xff0c;或传入一个列表。 例…

《数电》理论笔记-第3章-常用组合逻辑电路及MSI组合电路模块的应用

一&#xff0c;编码器和译码器 1&#xff0c;编码器 编码:用由0和1组成的代码表示不同的事物。 编码器:实现编码功能的电路&#xff0c; 常见编码器:普通编码器、优先编码器、二进制编码器二-十进制编码器等等 1.1 三位二进制普通编码器和三位二进制优先编码器 1分58秒开始 …

为什么您的企业 AI 战略可能会在 2024 年失败:模型下降与数据上升

我怀疑有些人会指责我设置引诱性标题。 其他人会说&#xff0c;这并不是真正的范围——大多数人在最初的人工智能尝试中都会失败&#xff0c;但这并不重要&#xff0c;学习是值得的。在某种程度上&#xff0c;两者都是对的——但我认为为什么企业会失败是值得探索的&#xff0c…

2024-02-16 web3-区块链-keypass记录

摘要: 2024-02-16 web3-区块链-keypass记录 文档&#xff1a; Introduction - Keypass Docs What is KEYPASS&#xff1f; - Keypass Docs What is KEYPASS&#xff1f; KeyPass Wallet is a new smart contract wallet that provides a secure and customizable registration…

并发编程(1)基础篇

1 概览 1.1 这门课讲什么 这门课中的【并发】一词涵盖了在 Java 平台上的 进程线程并发并行 以及 Java 并发工具、并发问题以及解决方案&#xff0c;同时也会讲解一些其它领域的并发 1.2 为什么学这么课 我工作中用不到并发啊&#xff1f; 那你还是没有接触到复杂项目. …

【JavaScript】添加、移除、移动、复制、创建和查找节点

创建新节点 document.createElement(tagName); // 创建⼀个指定标签名的元素节点 document.createTextNode(text); // 创建⼀个包含指定⽂本的⽂本节点 document.createDocumentFragment(); // 创建⼀个空的⽂档⽚段节点 添加、移除、替换、插⼊节点 parentNode.appendChild(…

猫头虎分享已解决Bug || TypeError: Cannot read property ‘value‘ of undefined

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

寒假作业2月6号

第五章 静态成员与友元 一、填空题 1、一个类的头文件如下所示&#xff0c;num初始化值为5&#xff0c;程序产生对象T&#xff0c;且修改num为10&#xff0c;并使用show()函数输出num的值10。 #include <iostream.h> class Test { private: static int num; publi…

[数学建模] 计算差分方程的收敛点

[数学建模] 计算差分方程的收敛点 差分方程&#xff1a;差分方程描述的是在离散时间下系统状态之间的关系。与微分方程不同&#xff0c;差分方程处理的是在不同时间点上系统状态的变化。通常用来模拟动态系统&#xff0c;如在离散时间点上更新状态并预测未来状态。 收敛点&…

深入解析Spring EL表达式:概念、特性与应用

在Spring框架中&#xff0c;Spring Expression Language&#xff08;简称Spring EL&#xff09;是一种功能强大的表达式语言&#xff0c;它支持在运行时查询和操作对象图。本文将详细介绍Spring EL表达式的概念、特点、基本语法和用法&#xff0c;并探讨在Spring框架中的应用场…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十一)(1)(2)(3)

目录 实验十一&#xff1a;非线性方程&#xff08;组&#xff09;求解 练习一 练习二 练习三 实验十一&#xff1a;非线性方程&#xff08;组&#xff09;求解 练习一 1.求莱昂纳多方程 的解 clc;clear; p[1,2,10,-20]; roots(p)ans -1.6844 3.4313i -1.6844 - 3.4313i…

U盘重装系统

因为系统管理员密码忘记&#xff0c;登录不了window系统&#xff0c;使用老毛桃制作U盘启动盘 1、下载老毛桃 下载地址为http://lmt.psydrj.com/index.html 安装后&#xff0c;桌面上显示为 2、制作U盘启动盘 启动老毛桃U盘启动装机工具&#xff0c;插入U盘&#xff0c;点击一…

2/15 homework

1、选择题 1.1、有以下程序 int main() { char a[7]"a0\0a0\0";int i,j; isizeof(a); jstrlen(a); printf("%d %d\n",i,j); } //strlen求出字符串的长度&#xff0c;其实是字符串中字符的个数&#xff0c;不包括\0 程序运行后的输出结果是…

【More Effective C++】条款21:用重载技术避免隐式类型转换

没有重载形式&#xff0c;upi3 upi1 10和upi3 20 upi2也能调用成功&#xff0c;因为进行了隐式转换 增加重载函数&#xff0c;避免隐式转换过程中临时对象的构建和析构成本C中的操作符重载要求至少有一个操作数是用户定义的类型&#xff08;如类或枚举类型&#xff09; 所以…