2012-12-20 37 views

回答

5

没有与此代码没有问题,因为通过它的每一个可能的路径必然导致return声明*。这并不一定是最后陈述文字上,只要它是最后的语句逻辑(Java编译器是足够聪明弄清楚,如果是这样,给你一个错误,如果有通过你的代码路径不返回值或抛出异常)。会有击中return(即你的finally块)后执行代码的事实不会改变任何东西:只要编译器而言,你的函数退出函数之前提供一个返回值。

*事实上,函数代码中只有一条路径,它终止于return语句。

+0

返回一个值或抛出错误。 – Sam

+1

@SamWard绝对 - 非常感谢您的纠正! – dasblinkenlight

+0

有趣的部分是当你添加一个“catch”并且不重新抛出。然后事情变得更有趣:-)(请参阅我的回答:http://stackoverflow.com/a/13977143/129655) –

2

它是Java足以确保所有可能的代码路径要么返回值或抛出异常。例如,下面的代码是有效的:

public boolean test() { 
    if (3 < 5) { 
     return true; 
    } else { 
     throw new RuntimeException("Holy crap!"); 
    } 
} 

在你的榜样,你的try块有回结束,所以快乐路径覆盖,没有必要超越finally代码;此外,在try中抛出的任何异常都将传播出该方法,并且没有机会到达该方法的末尾,因此所有可能的路径将永远不会碰到finally块下的部分,并且不需要返回语句。 (实际上,如果在底部添加return语句,编译器可能会给您一个关于无法访问的代码的警告或错误!)

当您添加catch子句时,事情会发生变化,因为现在代码可能会超出try/catch/finally块:

public String test(){ 
    try{ 

     // Do my work 

     return "myValue"; 

    } 
    catch (Exception ex) { 
     System.out.println("O noes something went wrong"); 
     // swallow exception 
    } 
    finally { 
     System.out.println("I'm in Finally"); 
    } 

    // Oh no! If an exception was caught, code can actually flow through here. 
    // Compiler will complain about a missing return statement until you add one. 
    // return "someOtherValue"; 
} 
1

在这种情况下tryfinally总是执行。所以,return在哪里并不重要。

public String myfun(){ 
    return "here"; 
} 

or 

public String myfun(){ 
    try{ 
     return "here"; 
    }finally{ 
     //will execute always 
    } 
} 

几乎是相同的。什么时候,你看到程序的流程。但是,如果有哪个条件像

public String myfun(){ 
     if(x==1){ 
      return "here"; 
     } 
     else{ 
      // something here 
     } 
} 

在这种情况下,它会引发错误。因为,任何一个块都不会同时执行。同

public String fun(){ 
    try{ 
      return "here"; 
    } 
    catch(Exception e){ 
      //catch implementation without return 
    } 
} 
+1

这不是一个非常明确的答案。添加一个不会重新抛出的catch语句,例如:然后会发生什么? –

+0

@PlatinumAzure只等几分钟。 – Ravi

+0

@PlatinumAzure现在,检查我的答案,并让我知道。 – Ravi

1

关键JLS概念,这是Normal and Abrupt Completion of Statements,结合try-finally行为。

的try块突然结束,因为“myvalue的”的回归。 finally块正常完成,所以整个try语句突然完成,原因与try块相同,返回“myValue”。

实际上,方法中的最后一个语句try语句是返回String的语句。