首页  >  编程教程  >  编程问答  >  Java中finally语句块中的代码一定会被执行吗?

Java中finally语句块中的代码一定会被执行吗?

我们都知道,在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语句效果给覆盖掉。



本文固定URL:https://www.dotcpp.com/qa/55

编程杂谈
编程基础
知识答疑