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

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

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

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

但是,如果出现的问题是Javaexception已经指出的问题,那么只是让该exception不被处理就可以了。 您不必捕获exception并调用System.exit

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

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

总而言之,仅在顶级exception处理程序中调用System.exit

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

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

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

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

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!"); } 

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

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

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

Interesting Posts