2012-12-26 12 views
5

在Java中,我们使用System.exit(int)来退出程序。 C中“退出值”的原因是退出值用于检查程序中的错误。但在Java中,错误通过抛出异常来反映,因此可以轻松处理它们。那么为什么我们有Java的退出值呢?为什么我们在Java中有退出码?

+8

。 –

+5

为什么所有的downvotes? – arshajii

+0

possiblity duplicate http://stackoverflow.com/q/457338/668970 – developer

回答

13

退出值返回给调用程序例如贝壳。异常不能被外部程序捕获。

顺便说一句如果抛出一个异常,它被该线程捕获或该线程死亡,那么该线程仍然会调用finally块。当你调用System.exit()时,所有的线程立即停止,最后不会调用块。

0

退出值返回给调用者,表示程序成功或不成功完成。调用者可能无法捕捉异常并相应地处理它。

例如, 0退出值意味着成功完成,而非零返回值意味着执行中出现一些错误。

此外,System.exit()的将应用程序中的所有线程停止在该点本身。

3

出于同样的原因。

退出代码仅供程序外部的应用程序和应用程序使用,以用于调试和处理目的。超级应用程序确实可以处理返回代码,而不是试图解析堆栈跟踪。另外,如果你正在为一个最终用户创建一个应用程序,那么你应该从你的应用程序中优雅地退出,而不是发布一堆栈跟踪信息,原因有两个:其中一个,你只会吓到它们有很多看起来很疯狂的技术乱码,以及两个堆栈跟踪通常会揭示关于程序基本构造方式的敏感和机密信息(给予潜在攻击者更多关于系统的知识)。

对于真实世界的例子,我正在上使用的退出代码为它工作在Java批处理程序。用户可以根据退出代码是否为“0”来查看作业是否成功执行。如果还有其他事情,他们可以联系技术支持人员,并附上退出代码的附加信息,并且服务台将根据退出代码提供所有必要信息以帮助解决问题。它比试图询问非技术性最终用户好得多,“好的,那么你得到了什么样的异常?”

0

长话短说,退出代码是简化的信号,运行Java程序时谁遇到异常的用户。由于我们假定大多数用户不理解异常的堆栈跟踪数据,因此这些简单的非零自定义代码将告诉他们有什么不对,并且应该向供应商报告。因此,供应商获得代码,他知道与该代码相关的堆栈跟踪并尝试修复系统。这是程序员提供的抽象,用户不必阅读和报告大量的堆栈跟踪。这里的一个很好的类比是SQLException类中的getErrorCode()方法。此方法还会关闭当前运行在客户机上的JVM。这意味着这会终止JVM中的所有线程。此方法在类Java.lang.Runtime中调用exit方法。如果您阅读此方法的文档,您将了解虚拟机如何关闭。

这是为操作系统指定的退出值的链接 http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exit%28int%29

相关问题