代码之家  ›  专栏  ›  技术社区  ›  Choxx

是否可以停止finally块的执行?

  •  1
  • Choxx  · 技术社区  · 10 年前

    这没有任何意义,但我很想知道是否有可能停止执行 最后一块 在java中?如果是,怎么做? 例如,说出以下代码:

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

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

    我总结道,这似乎是可能的。所有答案都有答案 不同于接受这是可能的。所以,我不接受任何 具体回答。请他们根据您的满意程度得出结论。感谢所有人 谁发布了答案。

    5 回复  |  直到 10 年前
        1
  •  2
  •   pola sai ram    10 年前
    1. A infinite loop above it will stop its execution
    2. System.exit() above it will stop it
    
        2
  •  2
  •   Community CDub    8 年前

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

       System.exit(0) 
    

    看见 Difference in System. exit(0) , System.exit(-1), System.exit(1 ) in Java

        3
  •  2
  •   Marko Topolnik    10 年前

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

    try {
      try {
        ...code...
      } finally { 
         ...resource cleanup, ThreadDeath thrown here...
      }
    } catch (ThreadDeath t) {
      System.out.println("Thread was ordered to stop, ignoring.");
    }
    
        4
  •  1
  •   Boris the Spider    10 年前

    JLS §14.20.2

    A. try 带有 finally 通过首先执行 这个 尝试 块然后有一个选择:

    • 如果执行 尝试 块正常完成,然后 最后 块,然后有一个选择:
      • 如果 最后 块正常完成,然后 尝试 语句正常完成。
      • 如果 最后 块由于原因突然完成 S ,然后 尝试 语句突然结束是有原因的 S .
    • 如果执行 尝试 块由于抛出值而突然完成 V ,则有一个选择:
      • 如果 五、 赋值是否与任何可捕获的异常类兼容 catch 条款 尝试 陈述 然后是第一个(最左边的)这样的 接住 子句。价值 五、 分配给选定的参数 接住 条款,以及 这一块 接住 子句。然后有一个选择:
        • 如果 接住 块正常完成,然后 最后 执行块。然后有一个选择:
          • 如果 最后 块正常完成,然后 尝试 语句正常完成。
          • 如果 最后 块由于任何原因突然完成,然后 尝试 出于同样的原因,语句突然结束。
        • 如果 接住 块由于原因突然完成 R ,然后 最后 执行块。然后有一个选择:
          • 如果 最后 块正常完成,然后 尝试 语句突然结束是有原因的 R .
          • 如果 最后 块由于原因突然完成 S ,然后 尝试 语句突然结束是有原因的 S (和原因 R 是 丢弃)。
      • 如果 五、 赋值与任何 接住 条款 尝试 陈述 然后 最后 执行块。然后有一个选择:
        • 如果 最后 块正常完成,然后 尝试 语句由于抛出值而突然完成 五、 .
        • 如果 最后 块由于原因突然完成 S ,然后 尝试 语句突然结束是有原因的 S (以及价值 五、 被丢弃和遗忘)。
    • 如果执行 尝试 由于任何其他原因,块突然完成 R ,然后 最后 块,然后有一个 选择:
      • 如果 最后 块正常完成,然后 尝试 语句突然结束是有原因的 R .
      • 如果 最后 块由于原因突然完成 S ,然后 尝试 语句突然结束是有原因的 S (和原因 R 是 丢弃)。

    简而言之,如果JVM没有退出(通过 System.exit )然后 最后 块是 总是

    但是 最后 块可能异常退出,例如抛出异常,在这种情况下 最后 块将仅部分执行。

        5
  •  1
  •   candied_orange Elliott Frisch    10 年前

    我想 this 说得最好:

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

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