3

最后一条语句应该return在非 void 返回类型方法中吗?但这仍然有效。

public String test()
{
    try
    {
        // Do my work
        return "myValue";
    }
    finally
    {
        System.out.println("I'm in Finally");
    }
}

我有点缺乏了解这是如何工作的知识。谁能给我解释一下。

4

4 回答 4

5

这段代码没有问题,因为通过它的每一条可能的路径都不可避免地导致return声明*。它不必是文本上的最后一个语句,只要它是逻辑上的最后一个语句(Java 编译器足够聪明,可以判断它是否是这样,如果代码中的路径不返回值或抛出异常)。return在点击(即你的块)之后会有代码执行的事实finally并没有改变任何东西:就编译器而言,你的函数在退出函数之前提供了一个返回值。

*事实上,你的函数代码只有一条路径,它在return语句处终止。

于 2012-12-20T17:05:55.333 回答
2

在 Java 中,确保所有可能的代码路径要么返回值要么抛出异常就足够了。例如,以下代码是有效的:

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

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

添加catch子句时情况会发生变化,因为现在代码有可能超出try//块catchfinally

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";
}
于 2012-12-20T17:08:55.200 回答
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 
      }
 }

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

public String fun(){
     try{
          return "here";
     }
     catch(Exception e){
          //catch implementation without return
     }
}
于 2012-12-20T17:09:06.760 回答
1

JLS 的关键概念是Normal 和 Abrupt Completion of Statements,以及try-finally的行为。

由于“myValue”的返回,try 块突然完成。finally 块正常完成,因此整个 try 语句由于与 try 块相同的原因而突然完成,返回“myValue”。

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

于 2012-12-20T17:22:51.850 回答