是否可以停止执行finally块?

时间:2015-03-29 10:32:12

标签: java exception-handling finally

这还没有任何意义我仍然很想知道是否可以在java中停止执行 finally阻止?如果有,怎么样? 比如下面的代码:

public class Foo 
{  
    public static void main(String[] args) 
    {
        try 
        { 
            return; 
        } 
        finally 
        {
            System.out.println( "Yes, I executed successfully." ); 
        } 
    } 
}

我希望控制台上的输出不会像是的,我执行成功。

  

嗯,这似乎有可能我得出结论。所有答案都有   不同的是接受它是可能的。所以,我不接受任何   具体回答。根据您的满意度,参考他们达成结论。谢谢大家   谁发布了答案。

5 个答案:

答案 0 :(得分:2)

1. A infinite loop above it will stop its execution
2. System.exit() above it will stop it

答案 1 :(得分:1)

我认为this说得最好:

  

注意:如果在执行try或catch代码时JVM退出,则finally块可能无法执行。同样,如果执行try或catch代码的线程被中断或终止,则即使整个应用程序仍在继续,finally块也可能无法执行。

但是,try中的return语句不会阻止finally块的执行。也不会抛出异常。这种行为就是为什么finally块首先存在的原因。它可以让您可靠地清理资源。

答案 2 :(得分:1)

我还没有遇到过你真正需要的情况。但其典型的面试问题和答案是

   System.exit(0) 

请参阅 Difference in System. exit(0) , System.exit(-1), System.exit(1 ) in Java

答案 3 :(得分:1)

来自JLS §14.20.2

  

首先执行带有try块的finally语句   try块。然后有一个选择:

     
      
  • 如果try块的执行正常完成,则执行finally块,然后有一个选择:   
        
    • 如果finally块正常完成,则try语句正常完成。
    •   
    • 如果finally块突然因为S而突然完成,则try语句突然完成,原因为S
    •   
  •   
  • 如果由于抛出值try而导致V块的执行突然完成,则可以选择:   
        
    • 如果V的运行时类型与catch语句的任何try子句的可捕获异常类兼容,   然后选择第一个(最左边)这样的catch子句。值V   被分配给所选catch子句的参数,以及   执行该catch子句的块。然后有一个选择:   
          
      • 如果catch块正常完成,则执行finally块。然后有一个选择:   
            
        • 如果finally块正常完成,则try语句正常完成。
        •   
        • 如果finally块因任何原因突然完成,则try语句会因同样的原因突然完成。
        •   
      •   
      • 如果catch块因原因R突然完成,则执行finally块。然后有一个选择:   
            
        • 如果finally块正常完成,则try语句突然完成,原因为R
        •   
        • 如果finally块突然因为S而突然完成,则try语句突然完成,原因为S(原因R为   丢弃)。
        •   
      •   
    •   
    • 如果V的运行时类型与catch语句的任何try子句的可捕获异常类不兼容,   然后执行finally块。然后有一个选择:   
          
      • 如果finally块正常完成,则try语句突然完成,因为抛出了值V
      •   
      • 如果finally块突然因原因S而完成,则try语句突然完成,原因为S(以及值抛出)   V被丢弃并被遗忘。)
      •   
    •   
  •   
  • 如果try块的执行由于任何其他原因R突然完成,则执行finally块,然后执行   选择:   
        
    • 如果finally块正常完成,则try语句突然完成,原因为R
    •   
    • 如果finally块突然因为S而突然完成,则try语句突然完成,原因为S(原因R为   丢弃)。
    •   
  •   

简而言之,如果JVM没有退出(通过System.exit),则finally始终运行。

但是finally块可能会异常退出,例如通过抛出异常,在这种情况下finally块只会部分执行。

答案 4 :(得分:1)

Thread.stop()导致在目标线程中抛出异常。这是异步发生的,也可能在执行finally块时发生。在这种情况下,finally块将突然完成,但允许它发生的线程继续执行。

try {
  try {
    ...code...
  } finally { 
     ...resource cleanup, ThreadDeath thrown here...
  }
} catch (ThreadDeath t) {
  System.out.println("Thread was ordered to stop, ignoring.");
}