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

 更新时间:2023年12月19日 08:32:26   作者:Java中文社群  
通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,本文想和大家聊聊finally中的代码一定会执行吗?,感兴趣的朋友跟着小编一起来看看吧

1.典型回答

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

  • 程序在 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 代码.");
        }
    }
}

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

  • 在 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 代码.");
        }
    }
}

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

  • 程序在 try 块中遇到无限循环或者发生死锁等情况时,程序可能无法正常跳出 try 块,此时 finally 块中的代码也不会被执行。
  • 掉电问题,程序还没有执行到 finally 就掉电了(停电了),那 finally 中的代码自然也不会执行。
  • JVM 异常崩溃问题导致程序不能继续执行,那么 finally 的代码也不会执行。

钩子方法解释

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

2.考点分析

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

3.知识扩展

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

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

以上就是聊聊finally中的代码一定会执行吗的详细内容,更多关于finally代码执行的资料请关注脚本之家其它相关文章!

相关文章

  • java能写爬虫程序吗

    java能写爬虫程序吗

    在本篇文章里小编给大家整理的是一篇关于java是否能写爬虫程序的一篇文章,对此有兴趣的朋友们可以学习下。
    2021-01-01
  • 基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

    基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

    这篇文章主要为大家详细介绍了java ssm springboot+mybatis实现酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java实现PDF转为Word文档的示例代码

    Java实现PDF转为Word文档的示例代码

    众所周知,PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性,在工作中可以有效避免别人无意中对文档内容进行修改。本文将分为以下两部分介绍如何在保持布局的情况下将PDF转为Word文档,希望对大家有所帮助
    2023-01-01
  • 一文详解如何在Java中自定义异常类

    一文详解如何在Java中自定义异常类

    这篇文章主要介绍了如何在Java中自定义异常类的相关资料,在Java编程中开发者可以通过继承Exception类或其子类创建自定义异常,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Quarkus的Spring扩展快速改造Spring项目

    Quarkus的Spring扩展快速改造Spring项目

    这篇文章主要为大家介绍了Quarkus的Spring项目扩展,带大家快速改造Spring项目示例演绎,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • 我劝你谨慎使用Spring中的@Scheduled注解

    我劝你谨慎使用Spring中的@Scheduled注解

    这篇文章主要介绍了Spring中的@Scheduled注解使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot下token短信验证登入登出权限操作(token存放redis,ali短信接口)

    SpringBoot下token短信验证登入登出权限操作(token存放redis,ali短信接口)

    这篇文章主要介绍了SpringBoot下token短信验证登入登出权限操作(token存放redis,ali短信接口),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • ssm 使用token校验登录的实现

    ssm 使用token校验登录的实现

    这篇文章主要介绍了ssm 使用token校验登录的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java使用FastJson解析Json数据

    java使用FastJson解析Json数据

    本篇文章主要介绍了java使用FastJson解析Json数据,fastjson 是一个性能极好的用 Java 语言实现的 JSON 解析器和生成器,有兴趣的可以了解一下。
    2017-02-02
  • CentOS安装solr 4.10.3详细教程

    CentOS安装solr 4.10.3详细教程

    这篇文章主要为大家详细介绍了CentOS安装solr 4.10.3的详细教程 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03

最新评论