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

Var*_*arV 17 java exception-handling errorlevel

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

Dav*_*d Z 10

除非你确实有特殊情况,否则不要抛出异常.System.exit(int)正是因为这个原因.用它.

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

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

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

  • 当应用程序未成功完成时,其返回代码应该是0以外的其他代码.因此,如果存在未处理的异常,JVM将自动将返回代码设置为1,以便父进程知道您的程序因错误而终止(而不仅仅是因为它完成了工作). (2认同)

Aar*_*rup 7

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

总而言之,System.exit只在您的顶级异常处理程序中调用:

static public void main() {
   try {
      runMyApp();
   } catch (Exception e) {
      System.exit(1);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 我可能会采用这个解决方案,但我正在寻找 System.exit 优于从 main 抛出异常的原因。 (2认同)