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

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

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

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

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

1、典型回答

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

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

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

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

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

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

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

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

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

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

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

钩子方法解释

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

2、考点分析

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

3、知识扩展

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

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

例如以下代码,使用 exit() 方法会执行 JVM 关闭钩子:k3I28资讯网——每日最新资讯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 代码。");        }    }}

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

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

而 halt() 退出的方法,并不会执行 JVM 关闭钩子,示例代码如下:k3I28资讯网——每日最新资讯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 代码。");        }    }}

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

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

小结

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

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

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

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

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

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
Top