我们都知道,在try…catch…finally语句中,finally作为异常处理的一部分,它紧紧地跟在try…catch语句后,且附带一个语句块,表示这段语句。
那么,在“正常”情况下,finally最终一定会被执行,不管有没有抛出异常,而且经常被用在需要释放资源的情况下。
那程序在运行过程中,一定会运行finally代码块吗?其实并不一定,以下几种情况中的finally语句块中的代码是不会运行的。
(1) try语句没有被执行到,如果在try语句之前return语句就返回了,此时finally语句就不会执行。这也说明了finally语句被执行的必要而非充分条件是相应的try语句一定被执行到。
(2) 如果一个线程在执行try语句块或者catch语句块时被打断(interrupted)或者被终止(killed),与其相对应的finally语句块可能不会执行。
(3) 在try块或者catch块中有System.exit(0);这样的语句。System.exit(0)是终止Java虚拟机(JVM)的,JVM都停止了,自然所有的程序就都结束了,当然finally语句也就不会被执行了。还有更极端的情况,比如:突然死机或者断电等等。
(4) 如果finally语句是在守护线程里面,当其他线程都执行完的时候,守护线程需要立即停止,退出虚拟机,此时finally语句也有可能没有执行到。
(5) 在try…catch…finally语句中,当return语句遇到finally语句时,return语句对finally语句无效,也就是说,在try块或者catch块里有return语句时,finally语句会被执行,finally语句块里的return语句会把try块或者catch块里的return语句效果给覆盖掉。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程