System.exit(num)或从main抛出RuntimeException?

时间:2010-08-18 23:50:25

标签: java exception-handling errorlevel

我有一个单线程应用程序,如果出现问题,应将DOS错误级别设置为非零值。抛出RuntimeException或使用System.exit(非零)更好吗?我不需要堆栈跟踪,我不希望这个应用程序被扩展/重用。这两个选项有什么区别?

7 个答案:

答案 0 :(得分:9)

除非你确实有异常情况,否则不要抛出异常。 System.exit(int)就是出于这个原因。使用它。

编辑:我想我可能误解了你的问题。我想你是在问,当你想要正常退出JVM但是发出一些不太正确的信号时,是抛出异常还是使用System.exit更好。

但是,如果出现的问题是Java异常已经指出的问题,那么只是让该异常处理得不好。您不必捕获异常并致电System.exit

如果您可以选择是否抛出自己的异常或调用System.exit,请考虑错误条件是否可能由某些调用您的方法的Java代码处理。如果错误直接发生在main方法中,则可能永远不会有调用者来处理异常,因此您应该调用System.exit。否则,通常最好抛出一个异常 - 但不是RuntimeException,你应该使用一个恰当代表你遇到的错误的异常类型。如有必要,请编写自己的RuntimeException子类。

答案 1 :(得分:7)

通常在这种情况下,我会通过调用System.exit来处理main方法中的所有异常。这使您可以灵活地处理异常条件的位置/是否/如何处理,同时仍然满足您使用错误代码终止的需要。特别是,它使您可以控制返回代码以及可能为用户生成的任何其他输出(错误消息,堆栈跟踪等)。如果在main中抛出异常(或者让异常转义),则会失去该控制。

总结一下,只在您的顶级异常处理程序中调用System.exit

static public void main() {
   try {
      runMyApp();
   } catch (Exception e) {
      System.exit(1);
   }
}

答案 2 :(得分:3)

抛出的异常将打印出堆栈跟踪,如果您不需要,则应使用System.exit。

退出后,您可以通过Sytem.out通知用户(我假设应用程序仅在commanline环境中运行)。

您应该考虑捕获所有错误并将错误记录在单独的日志中,这可以确保在关闭终端时堆栈跟踪不会永远丢失。为此目的看一下log4j,它非常容易使用。

答案 3 :(得分:2)

APP本身应该使用System.exit。它是与调用环境(脚本)的接口。当然,任何内部组件都应该使用Exception。当你把它放在一起时,它可以是'em:

Application.main(...) {
  parse(args);
  check(...);
  try {
    MyObject o = ...;
    o.doMyStuff();
  } catch (Exception e) {
    System.err.println("Oops, something went wrong!"); // by example, or use a logging framework! // anyway in a shell app System.in/out/err IS my interface with the outworld
    System.exit(ERROR_CODE);
  }
  System.out.println("Worked!");
}

答案 4 :(得分:0)

这取决于您要向启动程序的脚本报告多少信息。如果脚本旨在执行一系列动作,那么这可能非常重要。 https://shapeshed.com/unix-exit-codes/

示例:我开发了一个Java程序,该程序调用外部API,下载响应并将其保存到文件中。 可能的结果:

  • 0 =确定
  • 5 = HTTP暂时不可用
  • 6 =无法将文件写入磁盘

现在我的脚本知道出了什么问题,并且可以根据结果采取不同的操作。

  • 如果response = 0,请继续执行脚本中的下一步
  • 如果响应= 5,请重试(有延迟)
  • 如果响应= 6,则停止脚本

底线:像其他任何好的api一样,清楚地定义您的输入和输出参数并使用System.exit

答案 5 :(得分:-1)

System.exit(num)不是一个好的选择,因为它的关闭JVM,如果你有catch块后甚至没有运行finally块。

抛出RuntimeException也可能不是最好的选项,可以像前面提到的子类,这是app特定的异常在我看来可能是更好的选择。 -Manish

答案 6 :(得分:-4)

不建议使用System.exit()。它关闭了JVM。

相关问题