main() 方法的 Java 应用程序退出代码究竟是如何工作的?

How exactly works the Java application exit code of the main() method?

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

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

public static void main(String[] args) {

它的 return 类型是 void,这应该意味着它没有 return 任何值。但是当它的执行正确终止时,我在 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() 方法 return void 为什么会发生?

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

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

虚拟机在

时退出
  • 所有非守护线程停止 运行,或
  • System.exit(exitCode)被称为

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

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

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

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

Java 设计者 可以 为 return int 制作 main() 方法,以便 JVM 可以向 OS 此值作为进程退出代码。但他们决定让 main 无效,但提供 API 可以使用 System.exit(exitCode) 更新此代码。这种解决方案的优点是程序可以在任何点和任何线程中决定退出,而不仅仅是在主方法和主线程中。

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

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