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

问题描述 投票:18回答:7

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

java exception-handling errorlevel
7个回答
10
投票

除非您确实有特殊情况,否则不要抛出异常。正是出于这个原因,System.exit(int)在那里。使用它。

编辑:我想我可能误解了您的问题。我以为您是在问,什么时候您想正常退出JVM,但发信号说事情不太正常,是抛出异常还是使用System.exit更好。

但是,如果发生的问题是Java异常已经表明的问题,最好不处理该异常。您不必捕获异常并调用System.exit

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


7
投票

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


3
投票

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


2
投票

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


0
投票

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


-1
投票

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


-4
投票

System.exit()不推荐。它关闭了JVM。

© www.soinside.com 2019 - 2024. All rights reserved.