最后总是在方法完成之前执行?

时间:2013-11-18 08:44:07

标签: java try-catch

我介绍了一个我想编写代码的案例:

try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("i don't know if this will get printed out.");
}

(来自Does finally always execute in Java?

我的问题是:

finally总是在方法完成之前执行,还是在额外的thread中运行(因为该方法已经完成了对象的返回)?

换句话说:是否保证在main方法继续之前最终执行?

4 个答案:

答案 0 :(得分:4)

所有事情都发生在同一个线程中,只有顺序与程序顺序不同:

  1. return x仅在x被确定为返回值的部分执行;
  2. finally阻止执行;
  3. 1.方法中返回的值是从< - em>返回的,除非 finally块执行自己的return语句/抛出异常。

答案 1 :(得分:1)

简短的回答是,这是方法的一部分。

即使在return执行finally之后。

  

当try块退出时,finally块始终执行。

为什么?

  

这确保即使发生意外异常也会执行finally块。

澄清你的怀疑。让我们检查下面的代码(仅供测试,不是一个好的做法)。

ry {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("i don't know if this will get printed out.");
    return success;  //method returns this 
}

现在该方法返回finally

中的值

答案 2 :(得分:0)

如果执行try或catch代码的线程被中断或终止,则即使整个应用程序继续执行,finally块也可能无法执行。

答案 3 :(得分:0)

对于try-finallytry-catch-finally:finally子句确保在try块和任何可能执行的catch块之后执行finally块,无论控制如何离开try块或catch块。

但是,在使用return语句返回值时:

  • 记住trycatch块的返回值return语句。
  • 如果finally块没有return语句,则执行finally块后:
    1. 如果没有发生异常且(或)未被catch块捕获:记住返回try块的返回值。
    2. else,记住返回catch块的返回值。
  • 否则,它将使用finally块的return语句返回值,忘记try和(或)catch块的返回。

     public static Integer returnData()
     {
        Integer x = null;
    
        try{
          System.out.println("try the x: "+x);
          return x;
        }
        finally
        {
           x = 5;  // here i am assigning 5
           System.out.println("finally is printed with: "+x);  // printing 5
           return x;
        }
    
     }
    
     public static void main(String[] args) {
        System.out.println("Printing the return value in main: "+returnData());
          // printed 5 according to the assignment in finally block
      }
    

即使上述函数应该在null块中返回try,您也会看到运行上面的示例将会打印出来:

try the x: null
Hi finally is printed with: 5
Printing the return value in main: 5

现在,如果从finally块中删除return语句,您将看到以下输出:

try the x: null
finally is printed with: 5
Printing the return value in main: null

null被记为try区块的返回值。

查看jls: 14.20.2. Execution of try-finally and try-catch-finally了解详情。