本文共 1438 字,大约阅读时间需要 4 分钟。
网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有5种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。 (2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。 (3)在finally语句块中发生了异常。 (4)程序所在的线程死亡。 (5)关闭CPU。 1.finally语句是在try的return语句执行之后,return返回之前执行public class FinallyTest1 { public static void main(String[] args) { System.out.println(test1()); } public static int test1() { int b = 20; try { System.out.println("try block"); return b += 80; } catch (Exception e) { System.out.println("catch block"); } finally { System.out.println("finally block"); if (b > 25) { System.out.println("b>25, b = " + b); } } return b; } }
运行结果是:
try blockfinally blockb>25, b = 100100
说明return语句已经执行了再去执行finally语句,不过并没有直接返回,而是等finally语句执行完了再返回结果。
2. finally块中的return语句会覆盖try块中的return返回。 3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。 4. try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况。 5. 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样。 最后总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。转载地址:http://ulksi.baihongyu.com/