6

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

4

4 回答 4

14

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

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

于 2012-12-26T13:48:36.100 回答
3

出于同样的原因。

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

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

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

于 2012-12-26T13:51:19.777 回答
0

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

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

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

于 2012-12-26T13:50:01.163 回答
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

于 2012-12-26T14:43:45.883 回答