欢迎来到天天文库
浏览记录
ID:55263216
大小:149.51 KB
页数:14页
时间:2020-05-08
《关于 Java 中 finally 语句块的深度辨析.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、关于Java中finally语句块的深度辨析乍看这个题目,是不是有人会问,这个谁不知道啊,大凡熟悉Java编程的人都知道finally语句块的作用和用法。有什么可深度辨析的呢?事实并非如此,我发现即使写了很多年Java程序的人,也不一定能够透彻的理解finally语句块。本篇将以生动形象的案例来带您由浅入深的来分析一下这个小小的finally,希望这篇文章能够让您真正的理解finally语句块的本质,至少阅读完本篇文章后,没有觉得浪费了时间。可不能小看这个简单的finally,看似简单的问题背后,却隐藏了无数的玄机。接下来我就带您一
2、步一步的揭开这个finally的神秘面纱。问题分析首先来问大家一个问题:finally语句块一定会执行吗?很多人都认为finally语句块是肯定要执行的,其中也包括一些很有经验的Java程序员。可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子。清单1.publicclassTest{publicstaticvoidmain(String[]args){System.out.println("returnvalueoftest():"+test());}publicstaticinttest(){i
3、nti=1;//if(i==1)//return0;System.out.println("thepreviousstatementoftryblock");i=i/0;try{System.out.println("tryblock");returni;}finally{System.out.println("finallyblock");}}}清单1的执行结果如下:thepreviousstatementoftryblockExceptioninthread"main"java.lang.ArithmeticException:
4、/byzeroatcom.bj.charlie.Test.test(Test.java:15)atcom.bj.charlie.Test.main(Test.java:6)另外,如果去掉上例中被注释的两条语句前的注释符,执行结果则是:returnvalueoftest():0在以上两种情况下,finally语句块都没有执行,说明什么问题呢?只有与finally相对应的try语句块得到执行的情况下,finally语句块才会执行。以上两种情况,都是在try语句块之前返回(return)或者抛出异常,所以try对应的finally语句块没
5、有执行。那好,即使与finally相对应的try语句块得到执行的情况下,finally语句块一定会执行吗?不好意思,这次可能又让大家失望了,答案仍然是否定的。请看下面这个例子(清单2)。清单2.publicclassTest{publicstaticvoidmain(String[]args){System.out.println("returnvalueoftest():"+test());}publicstaticinttest(){inti=1;try{System.out.println("tryblock");System
6、.exit(0);returni;}finally{System.out.println("finallyblock");}}}清单2的执行结果如下:tryblockfinally语句块还是没有执行,为什么呢?因为我们在try语句块中执行了System.exit(0)语句,终止了Java虚拟机的运行。那有人说了,在一般的Java应用中基本上是不会调用这个System.exit(0)方法的。OK!没有问题,我们不调用System.exit(0)这个方法,那么finally语句块就一定会执行吗?再一次让大家失望了,答案还是否定的。当一个
7、线程在执行try语句块或者catch语句块时被打断(interrupted)或者被终止(killed),与其相对应的finally语句块可能不会执行。还有更极端的情况,就是在线程运行try语句块或者catch语句块时,突然死机或者断电,finally语句块肯定不会执行了。可能有人认为死机、断电这些理由有些强词夺理,没有关系,我们只是为了说明这个问题。回页首finally语句剖析说了这么多,还是让我们拿出些有说服力的证据吧!还有什么证据比官方的文档更具说服力呢?让我们来看看官方网站上的《TheJavaTutorials》中是怎样来描述
8、finally语句块的吧!以下位于****之间的内容原封不动的摘自于《TheJavaTutorials》文档。**************************************************************
此文档下载收益归作者所有