首页 > 其他分享 >finally中的代码一定会执行吗?

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

时间:2023-12-18 12:23:14浏览次数:34  
标签:钩子 代码 System try 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 的代码也不会执行。

钩子方法解释

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

2.考点分析

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

3.知识扩展

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() 方法并不会执行钩子方法或终结器。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:钩子,代码,System,try,finally,执行
From: https://www.cnblogs.com/vipstone/p/17910864.html

相关文章

  • Wasserstein距离的python代码实现scipy.stats.wasserstein_distance解释
    在官方文档scipy.stats.wasserstein_distance—SciPyv1.8.0.dev0+1869.838cfbeManual(osgeo.cn)页面中scipy.stats.wasserstein_distance(u_values,v_values,u_weights=None,v_weights=None)对参数u_values,v_value,u_weights,v_weights解释不清晰。通过看文章Wassers......
  • JVS低代码流程引擎,在业务管理界面如何发起流程?
    在业务管理的场景下,存在先做了对应的数据管理,后续增加管理的规范度,“在业务数据变化时发起流程”的需求,那么这种情况下就需要在业务管理(列表页、表单)中发起流程,让业务模型使用流程配置,通常在具体业务场景下触发事件启动流程,业务场景涉及具体列表页、表单页模型数据。示例:通过列表页......
  • 奇特的c代码
    `#include<string.h>include<stdlib.h>include<stdio.h>intfunc1(inta){printf("hahaa\n");//printf("hahaa=%d\n",2);a++;returna;}classcla1{public:inta1;};typedefcharIsIncompleteType[2];intmai......
  • cargo-make rust 任务执行以及构建工具
    再学习nakago框架的时候发现其使用了cargo-make这个工具,但是很方便,类似make的构建模式包含的特性依赖管理,别名支持,支持workspace简单使用安装cargoinstall--forcecargo-make参考使用创建一个cargo项目 cargonewappdemo......
  • 群智能优化算法测试函数matlab源代码
    globalM;creatematrix(2);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%画ackley图。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ackleyxfrom[-55]%x=-5:0.01:5;%[x,y]=meshgrid(x);%temp1=x.^2+y.^2;%temp2=cos(2*pi*x)+cos(2*pi*y);%z=20+exp(1)-20*exp(-0.2*sqrt(te......
  • PHP代码审计
    杂phps,可能可查看该php文件源码index.php.bak:index.php文件备份名php7.1+:类型不敏感,反序列化public属性可以直接赋给private_GET$_GET看成一个键值对数组(关联数组)$_GET==array(‘id’=>1,‘name’=>‘xiao’)函数引用&可以修改_GET....的值,不能修改_Request的值在url传......
  • 软件工程读后感10-代码阅读方法与实践4
    最近,我阅读了代码阅读方法与实践的下一部分。意义重大的编码工作,或大型、有组织体制之下的项目,比如GNU和BSD,都会采纳一套编码规范、指导原则或约定。计算机语言和编程系统为程序员如何表达一个给定的算法提供了大量的余地。代码规范提供风格上的指导,目标是增强代码的可靠性、易读......
  • SNP Bluefield助力日日顺物流公司进行IT系统代码拆分
         日日顺是海尔集团旗下综合服务品牌,旗下有日日顺物流、日日顺乐家、日日顺乐农等。日日顺物流为家电、家具、卫浴等品类的厂商、线下零售商和电子商务客户提物流服务。日日顺网点遍布全国,深入县、乡、村级地区,日日顺的优势在于大件配送。2018年,日日顺品牌价值301.08......
  • 公文传输系统代码
    `packagecom.fq.entity;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.annotation.TableId;importlombok.Data;@DatapublicclassGw{@TableId(value="id&quo......
  • 三菱变频器故障报警代码及故障
    三菱变频器故障报警代码之严重故障OC1加速时过电流断路是否急加速运转输出是否短路,主回路电源(R,S,T)是否供电。E.OC2定速时过电流断路负荷是否有急速变化,输出是否短路。E.OC3减速时过电流断路是否急减速运转,输出是否短路,电机的机械制动是否过早E.OV1加速时再生过电压断路加速度是......