【问题标题】:How exactly works the Java application exit code of the main() method?main() 方法的 Java 应用程序退出代码究竟是如何工作的?
【发布时间】:2015-04-28 14:02:54
【问题描述】:

我对一个简单的命令行 Java 应用程序有以下疑问。

所以我有这个命令行应用程序,它由 Main 类中定义的 main() 方法启动。像往常一样,这个 main() 方法是用这个签名定义的:

public static void main(String[] args) {

它的返回类型是void,这应该意味着它不返回任何值。但是当它的执行正确终止时,我会在 IntelliJ 控制台中获得以下消息。

Disconnected from the target VM, address: '127.0.0.1:54090', transport: 'socket'

Process finished with exit code 0

exit code 0究竟代表什么?我认为这意味着程序已经正确完成了执行,没有出现任何错误。

所以现在我有以下2个疑惑:

  1. 如果我的 main() 方法返回 void,为什么会发生这种情况?

  2. 如果我的应用程序以错误结束,我如何返回不同的退出代码?

是否有以错误结束的标准退出代码值?

【问题讨论】:

  • 退出代码 0 只是 java 约定的 0。在正常情况下,除 0 以外的退出代码应该是错误的指示符,如果 java 程序背后的程序员在使用 System.exit() 时没有遵循此约定,则不需要这样;

标签: java main exit-code


【解决方案1】:

VM 何时退出

  • 所有非守护线程停止运行,或
  • System.exit(exitCode) 被调用

在第一种情况下,退出代码为 0。在第二种情况下,它是传递给 exit() 方法的退出代码。

不要忘记,即使您的 main() 方法返回,程序也会继续运行,直到不再运行非守护线程。 VM 中运行的任何线程都可以选择显式退出。

退出代码 0 表示一切都按预期进行。您可以选择使用任何其他退出代码向环境发出异常情况的信号。

【讨论】:

【解决方案2】:

进程的退出代码是进程向操作系统报告的错误代码。

Java 设计人员可以使main() 方法返回int,以便JVM 可以将此值作为进程退出代码报告给操作系统。但他们决定让 main 无效,但提供可以使用 System.exit(exitCode) 更新此代码的 API。这种解决方案的优点是程序可以决定在任何时间点和任何线程中退出,而不仅仅是在主方法和主线程中。

【讨论】:

  • 你的观点“这个解决方案的优点是程序可以决定在任何点和任何线程中退出,不仅在主方法和主线程中。”有点没有实际意义;它不必是 only 一个返回码吗? C/C++ 和 C# 等其他语言支持这两种方法。
【解决方案3】:

退出代码 0 表示它正常完成,这是所有进程的标准,而不仅仅是 java。该值不是从 main 方法返回(它是 void),而是从 JVM 本身返回。

可以指定不同的值,例如System.exit(1) 表示一些错误情况,程序停止。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多