System.exit(1)的替代方案
出于各种原因,编写Java应用程序时会不赞成调用System.exit,所以如何通知调用过程并非一切都按计划进行?
编辑:1是任何非零退出代码的standin
。
解决方案
回答
正常退出时皱眉。如果"并非一切都按计划进行",那么System.exit就可以了。
更新:我要补充一点,我假设" 1"具有某处记录的含义。
回答
在Web Servlet环境中也可能是危险的/有问题的。
抛出异常通常被认为是另一种选择。
回答
我们公司的政策是可以(即使首选)调用System.exit(-1),但只能使用init()方法。在程序正常流程中调用它之前,我肯定会三思而后行。
回答
抛出异常是向上或者向下发送有关某个错误的信息的最佳方法。
一个数字告诉你的不多:
Exception at thread 'main': FileNotFoundException "The file 'foo' doesn't exist"
(或者类似的东西)
回答
我同意"抛出异常"的人群。原因之一是,如果希望其他代码能够使用它,则调用System.exit会使代码难以使用。例如,如果我们发现类对于Web应用程序或者某种消息消耗应用程序很有用,那么最好让这些容器有机会以某种方式处理故障。容器可能想要重试该操作,决定记录并忽略该问题,向管理员发送电子邮件等。
main()
方法是一个例外。这可能会捕获Exception,并使用一些可以被调用进程或者shell脚本识别的值调用System.exit()
。
回答
当"应用程序"确实是较大的Java应用程序(服务器)的子应用程序(例如servlet,applet)时,就不会使用" System.exit":在这种情况下," System.exit"可能会停止JVM。以及所有其他子应用程序。在这种情况下,抛出适当的异常(最好由应用程序框架/服务器捕获并处理)是最佳选择。
如果确实要将Java应用程序作为独立的应用程序运行,则使用System.exit
并没有错。在这种情况下,设置退出值可能是最简单(也是最常用)的将失败或者成功传达给父进程的方法。
回答
我认为抛出异常是我们在出现问题时应该采取的措施。这样,如果应用程序未作为独立应用程序运行,则调用者可以对此应用程序做出反应并获得有关发生问题的信息。它也更容易用于调试目的,因为我们也可以更好地了解堆栈跟踪时出了什么问题。
需要注意的重要一件事是,当异常达到最高级别并导致VM退出时,VM返回的返回码为1,因此使用该返回码的外部应用程序会发现出了问题。
我认为System.exit()有意义的唯一情况是,应用程序是由非Java的应用程序调用的,因此必须使用返回码来查看应用程序是否正常工作,并且我们希望这些应用程序具有有机会对出现问题的不同方式做出不同的反应,即我们需要不同的返回码。