Java中的finally一定会执行吗
这篇文章主要介绍“Java中的finally一定会执行吗”,在日常操作中,相信很多人在Java中的finally一定会执行吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的finally一定会执行吗”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
简介我们都知道,finally 作为异常处理的一部分,它只能紧跟在try/catch语句后,附带一个语句块,表示这段语句,“在正常情况下”,最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。那么在我们的应用在运行中,一定会运行finally代码块吗?其实不是的,有以下几种情况我们的finally代码块是不会运行的。
finally 代码块不会运行的情况情况一:代码流程并未进入try语句块这也是最好理解的情况,如果代码流程不进入try代码块,则相应的catch和finally代码块自然不会执行。
publicstaticvoidmain(String[]args){inti=0;System.out.println("entermainblock");booleanflag=false;if(flag){try{System.out.println("entertryblock");i=i/i;}catch(Exceptione){System.out.println("entercatchblock");}finally{System.out.println("enterfinallyblock");}}}
运行结果为:
情况二: 使用了 System.exit(int) 退出程序enter main block
在进入try或catch块后,使用了 System.exit(int) 退出程序。
publicstaticvoidmain(String[]args){inti=0;System.out.println("entermainblock");try{System.out.println("entertryblock");System.exit(0);i=i/i;}catch(Exceptione){System.out.println("entercatchblock");}finally{System.out.println("enterfinallyblock");}}
或
publicstaticvoidmain(String[]args){inti=0;System.out.println("entermainblock");try{System.out.println("entertryblock");i=i/i;}catch(Exceptione){System.exit(0);System.out.println("entercatchblock");}finally{System.out.println("enterfinallyblock");}}
运行结果为:
enter main block
enter try block
但是呢,如果 System.exit(int) 在try代码块异常语句之后, finally 还是会被执行,因为已经没有机会执行 System.exit(int) ,程序已经退出了,比如:
publicstaticvoidmain(String[]args){inti=0;System.out.println("entermainblock");try{System.out.println("entertryblock");i=i/i;System.exit(0);}catch(Exceptione){System.out.println("entercatchblock");}finally{System.out.println("enterfinallyblock");}}
运行结果为:
情况三:程序所在的线程死亡enter main block
enter try block
enter catch block
enter finally block
在当前线程死亡的情况下,finally里的语句也不会执行,比如干扰中断,或者程序外部kill该线程,或者是意外中止。
publicstaticvoidmain(String[]args){inti=0;System.out.println("entermainblock");try{System.out.println("entertryblock");//模拟执行任务10s,然后在执行任务过程中杀死该线程Thread.sleep(10*1000);i=i/i;}catch(Exceptione){System.out.println("entercatchblock");}finally{System.out.println("enterfinallyblock");}}
这里在休眠里,用kill命令,杀死该线程,模拟非正常退出,最后运行结果为:
enter main block
enter try block
这里值得注意的是,我们常常在try语句块里获取了一些临界资源,然后finally语句块里释放该资源。此时,如果正常获得取资源后,程序非正常中断,则我们并未正常释放该资源,就会导致资源可能会被无限占用,所以这里要考虑一下其它的解决方法,比如给资源设置一个使用时间等,到期自动收回。
情况四:其它非正常退出还有其它非正常退出(道理同上,就不演示了),也会导致finally代码块不执行,比如物理关闭电源,关闭 CPU等。这些其实在开发生产环境中是常有出现的,比如在开发中,某一台服务器获取锁后,不小心断电或宕机了(未成功释放锁),然后导致别的机器也不能获得到锁(如果锁无时间限制),最终导致出现系统型的问题。完事以后,你们开发也不知道发生了什么事,就把所有服务都重启了一次,解决了问题,最后说一句:“啊!还是重启大法好”。
到此,关于“Java中的finally一定会执行吗”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。