【问题标题】:Java - Is it bad if a method invokes System.exit?Java - 如果方法调用 System.exit 会很糟糕吗?
【发布时间】:2015-02-12 15:15:22
【问题描述】:

致电System.exit(0) 的最佳做法是什么?

我故意打电话给System.exit(0)。拨打System.exit(0)的正确方法是什么?

我应该只创建一个调用System.exit(0) 的方法吗?

谢谢。

【问题讨论】:

  • 什么报告这个警告? System.exit(0) 如果还没有在方法中,你在哪里调用?
  • 重复 - stackoverflow.com/questions/3715967/… - 我不同意接受的答案。
  • 你为什么打电话给System.exit(0)
  • 在大多数情况下我们使用 System.exit(1),如果我们通过脚本调用 jar 并且有一个否定用例预计返回退出代码 1 或以上,那么脚本将捕获代码并将其用于进一步的决定。

标签: java exit


【解决方案1】:

“最佳实践”实际上基于什么你想要执行

如果您确实希望立即终止程序,而不是让程序的上层决定做什么,您应该调用:System.exit(1)(或其他一些非零的正退出状态)。

  • 退出代码0 告诉shell(和父进程)执行正常完成;

  • 正面退出代码报告存在错误。您认为可能出错的事情实际上出错了;

  • 负退出代码是指您没有预料到的错误(系统错误 - 意外异常 - 外部强制终止,例如 kill -9);

【讨论】:

    【解决方案2】:

    此警告的动机(我猜您正在查看 findbugs 结果,但许多其他工具也有此警告)如下:

    当您直接致电System.exit() 时。您无法在单元测试或应用程序服务器中使用此代码。在这两种情况下,您的代码都在框架内运行,并且您不希望该框架退出。

    但是,当您有一个独立的应用程序时,您最终可能想要退出。这可以通过两种方式完成:通过让所有非恶魔线程完成任务或调用 System exit 来结束所有非恶魔线程的执行。在使用 3rd 方库的大型应用程序中,第一个选项通常不可行或不可能。

    所以我个人尝试限制我的应用程序执行一两次系统退出(例如当用户请求关闭应用程序时)。让它们远离代码的任何复杂部分,以便您可以测试和重用它们。

    【讨论】:

    • 还有另一个与 SO 相关的问题可能会有所帮助 - 我们何时应该在 Java 中调用 System.exit:stackoverflow.com/questions/3715967/…
    • 是否有注解告诉 FindBugs/SpotBugs:“我知道我在做什么”——过滤文件很繁琐
    【解决方案3】:
    • 在大多数情况下,如果我们通过调用 jar,我们使用 System.exit(1) 脚本,并且预计会返回一个负面用例 退出代码 1 或以上,然后脚本将捕获代码并使用 以作进一步决定。

    System.exit() https://www.baeldung.com/java-system-exit的指南

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2011-10-10
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多