【问题标题】:case where code never gets to clear() [duplicate]代码永远不会清除()的情况[重复]
【发布时间】:2012-10-21 03:22:46
【问题描述】:
try {
    if (check) {
        while (true) ;
    } else {
        System.exit(1);
    }
} finally {
    clear();
}

问:有没有clear() 永远不会被执行的情况? 个人感觉没有不执行 clear() 的情况。

【问题讨论】:

  • 你的意思是,没有更多情况 clear() 不会被执行?你有什么问题?

标签: java


【解决方案1】:

如果check 为真,那么您将陷入无限循环,在这种情况下,从技术上讲,您永远无法到达 finally 块。

否则,如果check 为假,则执行System.exit(1); 并终止您的程序;在这种情况下,它永远不会到达finally 块来执行clear()

在这个例子中,实际上是无法到达clear()

【讨论】:

  • 如果检查为真,也不会调用 clear()。
【解决方案2】:

如果System.exit 成功,clear() 将不会被执行。但是,System.exit(1) could throw SecurityException exception,在这种情况下,clear() 将被执行。

【讨论】:

  • 您的 System.exit() 抛出的建议是基于经验,还是仅仅是理论上的可能性?
  • @BrianAgnew 它基于 Java 文档;我从未见过这种情况发生,但我总是在完全信任的环境中运行 Java。
  • A SecurityManager 可以将 System.exit() 转换为抛出错误或异常。
【解决方案3】:

clear 只会在 try 块完成时执行。

如果 check 为真,那么 while(true) 将永远坐在那里,所以永远不要离开 try 块

如果check 为假,System.exit(0) 将退出程序,因此 finally 块也不会运行。但是System.exit(int) 可以抛出SecurityException,这会导致finally 被调用。

所以总而言之,我认为如果System.exit 抛出SecurityException 就可以调用它

【讨论】:

    【解决方案4】:

    是否存在 clear() 永远不会被执行的情况?

    你给出的两个例子,你可以通过运行代码来确认。

    当你有一个无限循环时,它之后什么都不会执行。

    当 System.exit() 成功时,立即停止线程。

    【讨论】:

      【解决方案5】:

      System.exit(1) 阻止 finally 子句运行。

      无论 try 或 catch 是正常返回还是异常返回,基本上都会在 try/catch 之后执行 finally 块。

      但是,System.exit 会阻止块返回。

      而(真);显然会无限期地阻塞。只是假设 while (true) ;是一个更有意义的东西的存根:)

      【讨论】:

      • -1 System.exit 可以抛出异常,导致finally被调用
      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 2016-08-26
      • 2021-12-25
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多