由于各种原因致电 System.exit 写作时被皱眉 Java应用程序, ,那么我如何通知调用进程并非一切都按计划进行?

编辑: 1 是一个 standin 对于任何非零退出代码。

有帮助吗?

解决方案

指某东西的用途 System.exit 当“应用程序”实际上是一个子应用程序时(例如大型 Java 应用程序(服务器)的 servlet、applet):在这种情况下 System.exit 可以停止 JVM,从而也停止所有其他子应用程序。在这种情况下,抛出一个适当的异常,可以由应用程序框架/服务器捕获和处理是最好的选择。

如果 java 应用程序确实要作为独立应用程序运行,那么使用 System.exit. 。在这种情况下,设置退出值可能是向父进程传达失败或成功的最简单(也是最常用)的方法。

其他提示

我同意“抛出异常“ 人群。原因之一是,如果您希望其他代码能够使用您的代码,则调用 System.exit 会使您的代码难以使用。例如,如果您发现您的类对于 Web 应用程序或某种消息消费应用程序很有用,那么最好让这些容器有机会以某种方式处理故障。容器可能想要重试操作、决定记录并忽略问题、向管理员发送电子邮件等。

一个例外是你的 main() 方法;这可能会捕获异常,并调用 System.exit() 具有一些可以被调用进程或 shell 脚本识别的值。

System.exit() 如果启动它的线程在关闭挂钩中使用,则会阻塞并创建死锁。

在 Web servlet 环境中它也可能是危险/有问题的。

抛出异常通常被认为是另一种选择。

我们公司的政策是可以(甚至是首选)调用 System.exit(-1),但只能在 init() 方法中调用。在程序的正常流程中调用它之前我肯定会三思而后行。

抛出异常是将有关特定错误的信息发送到应用程序之外的最佳方式。

数字并不能告诉你更多信息:

Exception at thread 'main': FileNotFoundException "The file 'foo' doesn't exist"

(或类似的东西)

这是令人皱眉的 普通的 退出。如果“并非一切都按计划进行”,那么 System.exit 就可以了。

更新:我应该补充一点,我假设你的“1”具有记录在某处的含义。

我认为抛出异常是出现问题时应该做的事情。这样,如果您的应用程序没有作为独立应用程序运行,调用者可以对其做出反应并获得有关出错原因的一些信息。它也更容易用于调试目的,因为当您看到堆栈跟踪时,您也可以更好地了解出了什么问题。

需要注意的一件重要事情是,当异常到达顶层并因此导致 VM 退出时,VM 将返回返回代码 1,因此使用返回代码的外部应用程序会发现出现了问题。

我认为 System.exit() 有意义的唯一情况是,当您的应用程序打算由非 Java 的应用程序调用时,因此必须使用返回代码来查看您的应用程序是否工作,并且您希望这些应用程序具有有机会对不同的问题做出不同的反应,即您需要不同的返回码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top