当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-12-18 17:36:45 366观看
导读通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,而今天这道题的答案也是符合这个套路。1、典型回答正常运行的情况下,finally 中的代码是一定会执行的,但是,

eIb28资讯网——每日最新资讯28at.com

通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,而今天这道题的答案也是符合这个套路。eIb28资讯网——每日最新资讯28at.com

1、典型回答

正常运行的情况下,finally 中的代码是一定会执行的,但是,如果遇到以下异常情况,那么 finally 中的代码就不会继续执行了:eIb28资讯网——每日最新资讯28at.com

程序在 try 块中遇到 System.exit() 方法,会立即终止程序的执行,这时 finally 块中的代码不会被执行,例如以下代码:eIb28资讯网——每日最新资讯28at.com

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

以上程序的执行结果如下:eIb28资讯网——每日最新资讯28at.com

eIb28资讯网——每日最新资讯28at.com

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

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

以上程序的执行结果如下:eIb28资讯网——每日最新资讯28at.com

eIb28资讯网——每日最新资讯28at.com

程序在 try 块中遇到无限循环或者发生死锁等情况时,程序可能无法正常跳出 try 块,此时 finally 块中的代码也不会被执行。eIb28资讯网——每日最新资讯28at.com

掉电问题,程序还没有执行到 finally 就掉电了(停电了),那 finally 中的代码自然也不会执行。eIb28资讯网——每日最新资讯28at.com

JVM 异常崩溃问题导致程序不能继续执行,那么 finally 的代码也不会执行。eIb28资讯网——每日最新资讯28at.com

钩子方法解释

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

2、考点分析

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

3、知识扩展

System.exit() 和 Runtime.getRuntime().halt() 都可以用于终止 Java 程序的执行,但它们之间有以下区别:eIb28资讯网——每日最新资讯28at.com

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

例如以下代码,使用 exit() 方法会执行 JVM 关闭钩子:eIb28资讯网——每日最新资讯28at.com

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 代码。");        }    }}

以上程序的执行结果如下:eIb28资讯网——每日最新资讯28at.com

eIb28资讯网——每日最新资讯28at.com

而 halt() 退出的方法,并不会执行 JVM 关闭钩子,示例代码如下:eIb28资讯网——每日最新资讯28at.com

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 代码。");        }    }}

以上程序的执行结果如下:eIb28资讯网——每日最新资讯28at.com

eIb28资讯网——每日最新资讯28at.com

小结

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

本文链接:http://www.28at.com/showinfo-26-48738-0.htmlFinally中的代码一定会执行吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Oracle数据库性能监控:洞察系统瓶颈的利器!

下一篇: Python 的 match 有点好用,推荐试试

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 轿车从天而降电动车主被撞身亡 超速抢道所致:现场视频让网友吵翻

    近日,上海青浦区法院判决轿车从天而降电动车主被撞身亡案,轿车车主被判有期徒刑一年。案件显示当时男子驾驶轿车在上海某路段行驶,前车忽然转弯提速超车,
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top