应该是last return语句和非void返回类型方法吗?

时间:2012-12-20 17:04:13

标签: java return

最后一个语句应该是return in和non void return types方法吗?但这仍然有效。

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

我有点缺乏了解这项工作的知识。有人可以解释一下吗。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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";
}

答案 2 :(得分: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
     }
}

答案 3 :(得分:1)

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

由于&#34; myValue&#34;的返回,try块突然完成。 finally块正常完成,因此整个try语句突然完成,原因与try块相同,返回&#34; myValue&#34;。

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