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

233 阅读2分钟

关注微信公众号 程序员小胖 每日技术干货,第一时间送达!

导语

程序在正常运行的情况下,finally 中的代码是一定会执行的。但是在异常情况finally 中的代码还会执行吗?答案是肯定不会执行的,但是有哪些情况导致不会执行的场景我们接下来做一个剖析。

System.exit()

程序在try代码块中遇到System.exit()方法, 会立即终止程序的执行,这时finally块中的代码不会被执行。

执行结果如下图:

奇怪是不是,接着来看下System.exit()是个什么好玩意儿. 它是Java.lang.System 类下的一个静态方法, 它接受一个整数参数作为退出状态码, 通常非零值表示异常终止,使用零值表示正常终止.其中,最重要的是使用exit()方法,会执行JVM关闭钩子或终结器.

Runtime.getRuntime().halt()

在try代码块中遇到Runtime.getRuntime().halt()代码,强制终止正在运行的JVM.与System.exit()方法不同,此方法不会触发JVM关闭序列.因此,当我们调用halt方法时,都不会执行关闭钩子或终结器.

执行结果如下图:

Runtime.getRuntime().halt() 是Runtime类下的一个实例方法,它接受一个整数参数作为退出状态码.其中退出状态码只是表示程序终止的原因,很少在程序终止时使用非零值.而使用halt()方法,不会执行JVM关闭钩子或终结器.

看到这里, 很多小伙伴都会疑惑那Runtime.getRuntime().halt()和System.exit()有啥区别, 其实区别很细微了System.exit()会执行ShutdownHook方法, Runtime.getRuntime().halt()不会执行

执行结果如下:

System.exit()

执行结果如下:

无限循环或发生死锁场景

当程序在try代码块中遇到无限循环或者发生死锁等情况时,程序可能无法正常跳出try代码块,此时finally块中的代码也不会被执行.

停电

当程序还没有执行到finally就停电了,finally中的代码肯定也不会执行.

JVM 异常

JVM异常崩溃问题导致程序不能继续执行,那么finally的代码也不会执行.

钩子方法

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