【面试题精讲】finally 中的代码一定会执行吗?

文章目录

    • finally 块的作用
    • finally 中的代码一定会执行吗?
      • 1. `System.exit()` 导致 JVM 终止
      • 2. 无限循环或死锁
      • 3. 程序被强制终止
    • 示例代码演示
      • 示例 1:正常情况下执行 finally 块
      • 示例 2:发生异常时执行 finally 块
      • 示例 3:System.exit() 导致 JVM 终止
      • 示例 4:无限循环导致 finally 块无法执行
    • 总结

在这里插入图片描述

🎉欢迎来到Java面试技巧专栏~【面试题精讲】finally 中的代码一定会执行吗?


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:Java面试技巧
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在Java编程中,try-catch-finally是一种常见的异常处理机制。finally块用于编写无论是否发生异常都必须执行的代码。然而,在一些情况下,finally中的代码并不一定会执行,这可能会在面试中成为一个常见的问题。本文将深入探讨finally中代码的执行情况,并提供一些示例以帮助你更好地理解。

在这里插入图片描述

finally 块的作用

首先,让我们回顾一下finally块的作用。finally块是try-catch-finally异常处理结构的一部分,它用于包含必须在try块或catch块执行之后无论是否发生异常都要执行的代码。通常,它用于释放资源、关闭文件、数据库连接等清理工作,以确保不会发生资源泄漏等问题。

下面是一个简单的示例,演示了finally块的基本用法:

FileInputStream inputStream = null;
try {inputStream = new FileInputStream("example.txt");// 执行一些操作
} catch (IOException e) {// 处理异常
} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {// 处理关闭文件时的异常}}
}

在上面的代码中,finally块用于确保inputStream被关闭,即使在try块中发生了异常。

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

现在,让我们来探讨一个更复杂的问题:finally中的代码一定会执行吗?答案是大多数情况下是的,但也存在一些特殊情况。

1. System.exit() 导致 JVM 终止

在Java中,如果在trycatch块中调用了System.exit(int status)方法,它将导致JVM终止,即Java虚拟机将立即退出。在这种情况下,finally块中的代码将不会执行,因为JVM已经停止了。

以下是一个示例:

try {// 一些操作System.exit(0); // JVM 将终止
} finally {// 这里的代码不会执行
}

2. 无限循环或死锁

如果在try块中存在无限循环或死锁,导致程序无法正常退出,那么finally块中的代码也将无法执行。

以下是一个示例,演示了无限循环导致finally块无法执行的情况:

try {while (true) {// 无限循环}
} finally {// 这里的代码不会执行
}

在上述示例中,由于无限循环,程序将无法正常退出,finally块中的代码将永远无法执行。

3. 程序被强制终止

如果在运行Java程序时,操作系统或外部进程强制终止了程序,finally块中的代码同样不会执行。这通常发生在操作系统出现故障、内存不足或管理员手动终止进程的情况下。

总之,finally块中的代码在大多数情况下都会执行,但在某些特殊情况下可能不会执行,需要注意这些情况以确保程序的稳定性和可靠性。

示例代码演示

下面我们通过一些示例代码来进一步说明finally块的执行情况。

示例 1:正常情况下执行 finally 块

public class FinallyExample1 {public static void main(String[] args) {try {System.out.println("Try block");} finally {System.out.println("Finally block");}}
}

上述代码中,没有发生异常,正常执行finally块,输出如下:

Try block
Finally block

示例 2:发生异常时执行 finally 块

public class FinallyExample2 {public static void main(String[] args) {try {System.out.println("Try block");int result = 1 / 0; // 除以零,抛出异常} catch (ArithmeticException e) {System.out.println("Catch block");} finally {System.out.println("Finally block");}}
}

上述代码中,发生了算术异常,但在进入catch块之前,仍然执行了finally块,输出如下:

Try block
Finally block
Exception in thread "main" java.lang.ArithmeticException: / by zeroat FinallyExample2.main(FinallyExample2.java:6)

示例 3:System.exit() 导致 JVM 终止

public class FinallyExample3 {public static void main(String[] args) {try {System.out.println("Try block");System.exit(0); // JVM 将终止} finally {System.out.println("Finally block");}}
}

上述代码中,调用了System.exit(0)方法,导致JVM终止,finally块不会执行,输出如下:

Try block

示例 4:无限循环导致 finally 块无法执行

public class FinallyExample4 {public static void main(String[] args) {try {System.out.println("Try block");while (true) {// 无限循环}} finally {System.out.println("Finally block");}}
}

上述代码中,由于存在无限循环,程序无法正常退出,finally块无法执行,输出如下:

Try block

总结

finally块是一种用于编写必须在trycatch块执行之后无论是否发生异常都要执行的代码的有用机制。大多数情况下,finally块中的代码都会执行,但在某些特殊情况下,如调用System.exit()、无限循环或程序被强制终止时,finally块中的代码可能不会执行。因此,在编写代码时,应该注意这些情况,以确保程序的可靠性和稳定性。希望本文对你更好地理解finally块的执行情况有所帮助。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

pytest+allure生成测试报告

pytest框架使用 一、安装插件 #常用安装插件 pytest pytest-html (生成html格式的自动化测试报告) pytest-xdist (测试用例分布式执行,多cpu分发) pytest-ordering(用于改变测试用例的执行顺序&#xff0…

【工具】SSH端口转发管理器,专门管理SSH Port Forwarding

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 开源代码看这里:http://xfxuezhang.cn/index.php/archives/1151/ 背景介绍 有时候需要用到ssh的端口转发功能。目前来说,要么是cmd里手敲指令,但每次敲也太麻烦了;或…

Vue中的router路由的介绍(快速入门)

路由的介绍 文章目录 路由的介绍1、VueRouter的介绍2、VueRouter的使用(52)2.1、5个基础步骤(固定)2.2、两个核心步骤 3、组件存放的目录(组件分类) 生活中的路由:设备和ip的映射关系(路由器) V…

GRU的 电影评论情感分析 - python 深度学习 情感分类 计算机竞赛

1 前言 🔥学长分享优质竞赛项目,今天要分享的是 🚩 GRU的 电影评论情感分析 - python 深度学习 情感分类 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 这…

Spring AOP的失效场景

首先,Spring的AOP其实是通过动态代理实现的,所以,想要让AOP生效,前提必须是动态代理生效,并且可以调用到代理对象的方法什么情况下会不走代理对象的调用呢?首先就是类内部的调用,比如一些私有方…

marker基因注释热图可视化函数(视频教程-通用函数)

这里我们分享一个热图函数,是一个可视化的函数,您只需要提供作图的matrix数据即可。最近对于图形注释使用点比较上头,所以我们这个函数的列注释使用设置的是点的注释形状。我们的函数解决了以下几个问题: 数据的自动排序和列的自定…

【实训项目】“优品果园”-线上水果商城小程序

1.项目背景 随着现代人对消费水平的追求以及对食物安全的需要,无污染、产地直销的有机水果受到越来越多市民的喜欢。交易过程的简洁化是现代消费者的追求,产地直销也是近期流行的一种新型的交易模式。产地直销的交易模式使得交易过程更加简便快捷&#…

电容笔什么牌子好?比较好用的ipad手写笔推荐

哪一种电容笔适合学生党?作为一名数字爱好者,我对电容笔还是有所了解的。其实苹果的电容笔,与一般的电容笔最大的不同之处,就是在于压感方面上。因为苹果的电容笔具有独一无二的“重力压感”,所以我们可以在绘图时使用…

Nacos(替代Eureka)注册中心

Nacos初步学习 Nacos 是一个开源的服务注册和配置中心,它允许您注册、注销和发现服务实例,并提供了配置管理的功能。下面是Nacos的最基础用法: 1. 服务注册和发现: 首先,您需要将您的应用程序或服务注册到Nacos中。…

termius mac版无需登录注册直接永久使用

1. 下载地址:termius下载 2. 解压安装 3. 当出现 “termius”已损坏,无法打开 则输入以下命令即可:sudo xattr -r -d com.apple.quarantine /Applications/Termius.app 最后去 系统设置-> 隐私与安全性-> 仍要打开 4. 删除app-update.yml文件&…

Ant Design Form.List基础用法

使用 Form.List 使用 项目中需要在新增可以多个如图 代码如下 // An highlighted block <Card title"产品信息" bordered{false}><Form.List name"productList" >{(fields, {add, remove}) > (<>{fields.map((field) > (<Ro…

佳音通讯400电话中心:在线自选,惠及企业

在当今竞争激烈的商业环境中&#xff0c;企业需要提供卓越的客户服务来脱颖而出。而一个高效的400电话中心则成为了越来越多企业的选择。佳音通讯400电话中心官方网站是企业选择400电话服务的首选平台&#xff0c;提供了在线自选功能&#xff0c;让企业能够根据自身需求灵活选择…

集群分发脚本xysnc

一、scp&#xff08;secure copy&#xff09; 安全拷贝 1.定义 scp&#xff08;Secure Copy&#xff09;是一个用于在不同计算机之间安全地复制文件和目录的命令行工具。它使用 SSH 协议进行连接和文件传输&#xff0c;提供了加密和身份验证机制&#xff0c;确保数据传输的安…

Excel 规范录入数据

文章目录 录入日期录入百分比 快捷键&#xff1a; tab&#xff1a;向右切换单元格 enter&#xff1a;向下切换行 shift tab&#xff1a;向左切换单元格 shiftenter&#xff1a;向上切换行 录入日期 输入今天的日期的快捷键&#xff1a;Ctrl ; 输入当时的时间的快捷键&a…

【QT5-程序控制电源-[GPIB-USB-HS]-SCPI协议-上位机-基础样例【2】】

【QT5-程序控制电源-[GPIB-USB-HS]-SCPI协议-上位机-基础样例【2】】 1、前言2、实验环境3、自我总结1、基础了解仪器控制-熟悉仪器2、连接SCPI协议3、了解GPIB-USB-HS4、软件调试-代码编写 4、熟悉协议-SCPI协议5、实验过程-熟悉软件&#xff08;1&#xff09;去官网NI&#x…

【踩坑】hive脚本笛卡尔积严重降低查询效率问题

前一阵子查看我们公司的大数据平台的离线脚本运行情况, 结果发现有一个任务居然跑了一天多, 要知道这还只是几千万量级的表, 且这个任务是每天需要执行的 于是我把hive脚本捞出来看了下, 发现无非多join了几个复杂的子查询, 应该不至于这么久, 包括我又检查了是不是没有加上每…

使用 KubeSkoop exporter 监测和定位容器网络抖动问题

作者&#xff1a;遐宇、溪恒 本文是 8 月 17 日直播的文字稿整理&#xff0c;文末可观看直播回放。除去文章内容外&#xff0c;还包括针对实际网络问题的实战环节。 容器网络抖动问题发生频率低&#xff0c;时间短&#xff0c;是网络问题中最难定位和解决的问题之一。 不仅如…

项目文件上传到行云codeup teambition

接手公司好几年的老项目&#xff0c;在行云上已经有1.9G的大小所以被限制上传了 只有花钱扩容或者重新建库。 1.重新建库&#xff1a;登录你的行云账户在代码库中新建代码库&#xff08;网上有详细的&#xff09; 创建成功后的库中只有readme文件。 2.复制代码库的下载地址 …

【计算机网络-自顶向下方法】应用层(SMTP、POP3、DNS)

目录 1. Electronic Mail电子邮件应用画像1.1 电子邮件系统1.2 邮件报文格式1.3 邮件访问 2. DNS&#xff08;Domain Name System&#xff09;2.1 DNS提供的服务2.2 DNS工作机理2.3 DNS资源记录2.4 DNS协议&#xff0c;报文2.5 小结 1. Electronic Mail 电子邮件应用画像 应用…

jmeter 请求发送加密参数

最近在做http加密接口&#xff0c;请求头的uid参数及body的请求json参数都经过加密再发送请求&#xff0c;加密方式为&#xff1a;ase256。所以&#xff0c;jmeter发送请求前也需要对uid及json参数进行加密。我这里是让开发写了个加密、解密的jar&#xff0c;jmeter直接调用这个…