为啥我们在 Java 中有退出代码?

Posted

技术标签:

【中文标题】为啥我们在 Java 中有退出代码?【英文标题】:Why do we have exit codes in Java?为什么我们在 Java 中有退出代码? 【发布时间】:2012-12-26 13:46:55 【问题描述】:

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

【问题讨论】:

为操作系统指定退出值。 可能重复***.com/q/457338/668970 @developer 我在问为什么我们在 Java 中有退出代码。您链接到的问题是关于 System.exit(0) 中的参数 0 检查该帖子中提供的文档。也给出了System.exit的解释 【参考方案1】:

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

顺便说一句,当您抛出异常时,它会被该线程捕获或该线程死亡,仍然会为该线程调用 finally 块。当你调用 System.exit() 时,所有线程立即停止并且 finally 块不会被调用。

【讨论】:

【参考方案2】:

出于同样的原因。

退出代码仅供程序之外的各方和应用程序用于调试和处理目的。超级应用程序绝对可以比尝试解析堆栈跟踪更好地处理返回码。

另外,如果您正在为最终用户创建应用程序,您宁愿从应用程序中优雅退出,也不愿发布一堆堆栈跟踪信息,原因有两个:一个,您只会吓到他们许多看起来很疯狂的技术废话,第二,堆栈跟踪通常会揭示有关程序基本结构方式的敏感和机密信息(为潜在的攻击者提供有关系统的更多知识)。

举一个真实的例子,我正在开发一个 Java Batch 程序,它使用退出代码来完成它的工作。用户可以根据退出代码是否为“0”来查看作业是否成功执行。如果是其他原因,他们可以联系技术支持,获得退出代码的附加信息,帮助台将拥有基于该退出代码的所有必要信息来帮助他们。它比试图问一个非技术的最终用户“好的,那么你得到了什么异常?”要好得多。

【讨论】:

【参考方案3】:

退出值返回给调用者,以表明程序成功或不成功完成。调用者可能无法捕获异常并进行相应处理。

例如。 0 退出值表示成功完成,而非零返回值表示执行中有错误。

此外,System.exit() 将使应用程序中的所有线程自行停止。

【讨论】:

【参考方案4】:

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

这是链接 http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exit%28int%29

【讨论】:

以上是关于为啥我们在 Java 中有退出代码?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Java 程序在捕获到异常后退出?

为啥我的 Xamarin.Android 项目不能在启用 Proguard 的情况下构建:“java.exe”退出代码 1

为啥调试时生成的程序退出代码会发生变化?

为啥它停止并以退出代码 11 结束?

为啥这段 Python 代码在无法连接 OBS 软件时需要 2 分钟才能退出?

为啥 PyQt 在没有信息的情况下会崩溃? (退出代码 0xC0000409)