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

And*_*ili 18 java program-entry-point exit-code

我有一个简单的命令行Java应用程序的疑问.

所以我有这个命令行应用程序,它由Main类中定义的main()方法启动.

像往常一样,这个main()方法定义了这个签名:

public static void main(String[] args) {
Run Code Online (Sandbox Code Playgroud)

所以它的返回类型是无效的.所以它应该意味着它不会返回任何价值.

但是为什么当它的执行正确终止时我将这条消息发送到IntelliJ控制台?

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

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

究竟代表退出代码0的是什么?

我认为这意味着程序已正确完成其执行而不会产生任何错误.

所以现在我有以下两个疑问:

  1. 如果确实如果我的main()方法返回void会发生什么?

  2. 如果我的应用程序以错误结束,如何返回不同的退出代码?是否存在标准退出代码值以结束错误?

TNX

JB *_*zet 30

VM退出时

  • 所有非守护程序线程都停止运行,或
  • System.exit(exitCode) 叫做

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

不要忘记,即使你的main()方法返回,程序也会继续运行,直到没有非守护程序线程运行为止.并且在VM中运行的任何线程都可以选择明确退出.

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

  • 守护程序线程是在最后一个"正常"非守护程序线程停止运行时自动停止运行的线程.阅读http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html (2认同)

Ale*_*exR 6

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

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

  • 你的观点“这个解决方案的优点是程序可以决定在任何点和任何线程中退出,而不仅仅是在主方法和主线程中。” 有点没有意义;它不一定是_only_返回码?其他语言(例如 C/C++ 和 C#)都支持这两种方法。 (2认同)

Nic*_*ckJ 6

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

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