2013-10-23 23 views
0

我知道,finally块来执行,即使代码抛出异常,也成功完成,现在我的疑问是这样的代码请问这个代码工作中的Java内部处理

收益40

这是显而易见的,但现在如果我

评论返回40;

返回10

任何人可以帮助我了解如何JVM返回10为什么不抱怨说,函数应该返回一个值。后trycatch

public class ExceptionTest { 
     public static void main(String[] args) { 
     int i= returnSomething(); 
     System.out.println(i); 
     } 

     private static int returnSomething() { 

      try{ 
       System.out.println("try"); 
       return 10; 
      } 
      catch(Exception e) 
      { 
       return 20; 
      } 
      finally 
      { 
       System.out.println("finally "); 
       return 40; 
      } 
     } 

    } 
+0

你可以看看这个[问题](http://programmers.stackexchange.com/q/188858)。它可能会清除你所有的疑惑! – SudoRahul

+0

http://stackoverflow.com/questions/15616984/return-statement-in-java-exception-handling – VAr

回答

1

根据Java语言规范,Section §14.20.2

与最后块A try语句通过首先执行try块执行。然后有一个选择:

  • 如果try块的执行正常完成,那么finally块被执行,然后有一个选择:
    • 如果finally块正常完成,则try语句正常完成。
    • 如果finally块突然结束的原因S,则try语句如果try块的执行为完成突然突然完成了原因S.

...

  • 任何其他原因 R,那么finally块被执行,然后有一个选择:
    • 如果finally块正常完成,则try语句ç由于原因R突然补齐。
    • 如果finally块由于原因S突然完成,则try语句因S原因突然完成(并且原因R被丢弃)。

当存在在try块没有return,则finally块被执行并在finally块的return将被使用。

当存在在tryreturn,则可以conscidered该try块突然结束,但是,根据JLS,所述finally块将仍然被代码返回之前执行。

您也可以参考JLS的Section §14.17来帮助理解返回声明。

有趣的是,在部分的底部注:

前面的描述说:“试图将控制转移”,而 不仅仅是“转移控制”,因为如果有任何试图陈述 (§ 14.20)在try块或catch catch子句包含返回语句的方法或构造函数中,那么在控制转移到方法的调用者之前,那些try语句的最后子句将按顺序最内层地执行到 或构造函数。突然完成finally子句可能会中断由return语句启动的控制传输。

0

finally块执行。因此,如果您发表评论return 40比它会返回try block值,如果没有发生异常。这就是为什么它return 10

如果发生异常,则返回catch block的值为20

0

这是一个很好的阅读finally block

finally块总是在try块退出时执行。这可确保即使发生意外异常也能执行finally块。但是最后对于不仅仅是异常处理而言非常有用 - 它允许程序员避免由于返回,继续或中断而意外绕过清理代码。清理代码放在finally块中总是一个很好的做法,即使没有预期的例外情况。

2

只是在try块执行前return,控制被转移到块finally。在执行finally块时,该函数返回,除非在finally块本身中有return

因此,当finally块中有return时,函数返回40,并且在finally块中没有返回时返回try块中的值。


这是建议在finally块返回。

+0

一个干净,简短的描述。几乎完美的,(它得到了我的投票),但是你可能想要改变“在达到......之后”的措辞到“在尝试块中执行返回之前......”。到达时只是一个模糊的指示,它是在执行之前还是在执行期间。 –

+0

@EdwinBuck谢谢。更新以摆脱歧义。 – devnull