前段时间,我同事问我 finally 中的代码一定会执行吗?我说,会。但是有两种情况例外!
今天抽个时间,给大家聊一聊是哪两种情况下,finally 中的代码不一定会被执行。
我们都知道,在正常情况下执行 try catch finally 代码块,不管被 try 的代码块中有没有异常,被 finally 包围的代码块总是会被执行。根据这个特性,我们总是在 finally 代码块中释放资源,连接等。
但是,这种情况,在下面两种代码中,finally 代码块将不会被执行。
也就是说,在 catch 中执行了 System.exit(1),在执行 finally 之前虚拟机被停止。这种情况下,finally 肯定就不会被执行了,因为虚拟机被关闭了。
还有一种情况是,被设置为守护线程的内部代码中的 finally 不会被执行。
这是因为守护线程会随着所有非守护线程的退出而退出。所以,在这种情况下,当 finally 的代码还未被执行到,非守护线程可能就被终结或退出了。在这种情况下,finally 块的代码不一定会被执行!
以上,我的代码写的都比较简陋,大家自行动手去测试吧!我敢说,很多人不清楚这个冷知识,大家共勉吧!