前段时间,我同事问我 finally 中的代码一定会执行吗?我说,会。但是有两种情况例外!

95% 的人都答错的一道阿里面试题:finally 中的代码一定会被执行吗?_java

今天抽个时间,给大家聊一聊是哪两种情况下,finally 中的代码不一定会被执行。


95% 的人都答错的一道阿里面试题:finally 中的代码一定会被执行吗?_java_02


我们都知道,在正常情况下执行 try catch finally 代码块,不管被 try 的代码块中有没有异常,被 finally 包围的代码块总是会被执行。根据这个特性,我们总是在 finally 代码块中释放资源,连接等。


95% 的人都答错的一道阿里面试题:finally 中的代码一定会被执行吗?_java_03


但是,这种情况,在下面两种代码中,finally 代码块将不会被执行。


95% 的人都答错的一道阿里面试题:finally 中的代码一定会被执行吗?_java_04

也就是说,在 catch 中执行了 System.exit(1),在执行 finally 之前虚拟机被停止。这种情况下,finally 肯定就不会被执行了,因为虚拟机被关闭了。


还有一种情况是,被设置为守护线程的内部代码中的 finally 不会被执行。


95% 的人都答错的一道阿里面试题:finally 中的代码一定会被执行吗?_java_05


这是因为守护线程会随着所有非守护线程的退出而退出。所以,在这种情况下,当 finally 的代码还未被执行到,非守护线程可能就被终结或退出了。在这种情况下,finally 块的代码不一定会被执行!


以上,我的代码写的都比较简陋,大家自行动手去测试吧!我敢说,很多人不清楚这个冷知识,大家共勉吧!