异常处理—try catch finally

finally语句总是会执行吗?

不一定

1.当没有进入try语句就发生异常的时候,不会执行finally语句(只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行)

2.当try语句中执行System.exit(0) 这个方法的时候,也不会执行finally语句

3.当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了

try 语句块中有 return 语句,那么 finally 语句块是在 return 之前执行,还是在 return 之后执行呢?

     try 语句块正常结束还是异常结束,finally 语句块是保证要执行的。如果 try 语句块正常结束,那么在 try 语句块中的语句都执行完之后,再执行 finally 语句块。如果 try 中有控制转移语句(return、break、continue),那 finally 语句块是在控制转移语句之前执行。如果 try 语句块异常结束,应该先去相应的 catch 块做异常处理,然后执行 finally 语句块。同样的问题,如果 catch 语句块中包含控制转移语句, finally 语句块是在这些控制转移语句之前。

           finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 break 和 continue。另外,throw 语句也属于控制转移语句。虽然 return、throw、break 和 continue 都是控制转移语句,但是它们之间是有区别的。其中 return 和 throw 把程序控制权转交给它们的调用者(invoker),而 break 和 continue 的控制权是在当前方法内转移。

异常处理—try catch finally_第1张图片

       finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。 由此,可以轻松的理解清单 5 的执行结果是 1。因为 finally 中的 return 1;语句要在 try 中的 return 0;语句之前执行,那么 finally 中的 return 1;语句执行后,把程序的控制权转交给了它的调用者 main()函数,并且返回值为 1。

异常处理—try catch finally_第2张图片

      

异常处理—try catch finally_第3张图片

由上图,我们可以清晰的看出,在 finally 语句块(iinc 0, 1)执行之前,getValue()方法保存了其返回值(1)到本地表量表中 1 的位置,完成这个任务的指令是 istore_1;然后执行 finally 语句块(iinc 0, 1),finally 语句块把位于 0 这个位置的本地变量表中的值加 1,变成 2;待 finally 语句块执行完毕之后,把本地表量表中 1 的位置上值恢复到操作数栈(iload_1),最后执行 ireturn 指令把当前操作数栈中的值(1)返回给其调用者(main)。

        When the Try block executes its return, the finally block is entered with the “reason” of returning the value 1. However, inside the finally block the value 2 is returned, so the initial intention is forgotten. In fact, if any of the other code in the try block had thrown an exception, the result would still be to return 2. If the finally block did not return a value but simply fell out the bottom, the “return the value 1 ″ reason would be remembered and carried out.

     总结:1.如果try,catch或者finally中都有return 语句,则finally中的return 的值会覆盖住try,catch中的

                 2,如果finally中没有return语句,则不会覆盖,会返回finally操作前try或者catch中保留的值。

异常处理—try catch finally_第4张图片

异常处理—try catch finally_第5张图片

异常处理—try catch finally_第6张图片

catch后会执行finally,但不会执行finally之后的语句了,try可以。

参考:https://www.ibm.com/developerworks/cn/java/j-lo-finally/

你可能感兴趣的:(异常处理)