关注微信公众号 程序员小胖 每日技术干货,第一时间送达!
导语
程序在正常运行的情况下,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)是一种由父类提供的空或默认实现的方法,子类可以选择性地重写或扩展该方法,以实现特定的行为或定制化逻辑.钩子方法可以在父类中被调用,以提供一种可插拔的方式来影响父类的行为.钩子方法通常用于框架或模板方法设计模式中.框架提供一个骨架或模板,其中包含一些已经实现的方法及预留的钩子方法.具体的子类可以通过重写钩子方法来插入定制逻辑,从而影响父类方法的实现方式.