通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,而今天这道题的答案也是符合这个套路 。
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 关闭钩子或终结器 。
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 代码 。");}}}
以上程序的执行结果如下:推荐阅读
- 星际战甲中的超能新星怎么刷
- 卜算子咏梅题目什么意思,卜算子咏梅其中的浪漫是什么意思
- 强化学习算法在资源调度与优化中的应用
- 数据持久化的利器,Python中的Pickle模块详解
- JVM 理解Java虚拟机:优化代码执行效率的内部机制
- 方舟飞龙怎么训,《方舟生存进化》飞龙怎么抓怎么驯服代码
- 这8个诗词中的字,你真的会读吗
- std::atomic 现代C++中的原子:详解、代码及应用
- 时序分析中的常用算法,都在这里了
- 人民的名义中的祁同伟多少岁