System.exit的替代方案(1)

由于各种原因,在编写Java应用程序时调用System.exit是不受欢迎的,那么如何通知调用进程并非所有内容都按计划进行?

编辑: 1是任何非零退出代码的standin品。

当’application’实际上是更大的Java应用程序(服务器)的子应用程序(例如servlet,applet)时, System.exit的使用是不受欢迎的:在这种情况下, System.exit可能会停止JVM,因此也会停止所有其他子应用程序。 在这种情况下,抛出适当的exception(可以由应用程序框架/服务器捕获和处理)是最佳选择。

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

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

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

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

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

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

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

抛出exception是向上和向外发送有关某个错误的信息的最佳方式。

一个数字并没有告诉你多少:

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

(或接近那个)

对于正常的出口,这是不赞成的。 如果“并非一切按计划进行”,那么System.exit就可以了。

更新:我应该补充一点,我认为你的’1’具有在某处记录的含义。

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

需要注意的一件重要事情是,当exception到达顶级并因此导致VM退出时,VM返回返回代码1,因此在使用返回代码的应用程序之外会看到出错的地方。

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