Java代码的返回值

24

有一个Java类,它创建了一个POST请求并将其发送到一个servlet。该类文件(test)的主要方法看起来像这样:

public static void main(String[] args) throws IOException {
  // Code logic goes here...
  // No return Statement
}

这是从一个 KornShell(ksh)脚本中调用的,类似于以下代码:

retcode=`$CLK_JAVA_PATH -cp $CLASSPATH test ${PASSWORD} ${HOSTNAME} ${TOOLSET}`

if [ $? != "0" ];then
        echo "ERROR:  
        echo "${retcode}"
else
        echo "${SCRIPT} Success"
fi

retcode 的值始终为“2”,无论代码失败或成功。

我的问题是,由于我的主方法的返回类型是“void”,为什么代码会返回某个值?

6个回答

53
Java应用程序的返回值不是main方法的返回值,因为Java应用程序不一定在其main方法执行结束时结束运行。
相反,JVM在没有其他非守护线程运行或调用System.exit()时结束运行。
System.exit()也是指定返回值的唯一方式:传递给System.exit()的参数将被大多数操作系统用作JVM进程的返回值。
因此,在main()方法结尾处添加以下内容:
System.exit(0);

这将确保两件事情:

  • main函数结束时,你的Java应用程序真正退出。
  • JVM进程的返回值为0。

2
这应该是被接受的答案,因为它对内部工作原理有更好的解释。 - searchengine27
2
值得注意的是,由于在trycatch子句中放置了System.exit(),因此finally块将不会被执行 - 因此,如果需要执行一些清理代码,则应考虑这一点。 - Cromax

18

Java程序不会通过从main返回值来将退出代码返回给操作系统,就像在C和C++中所做的那样。您可以通过调用System.exit(code);来退出程序并指定退出代码,例如:

// Returns exit code 2 to the operating system
System.exit(2);

6

4

使用

System.exit( someNumber );

这将使你的应用程序控制操作系统看到的返回值。

3
你的程序在退出后总是返回一个返回码。在普通程序中,如果你没有指定返回码,它将返回零(这包括将返回类型设置为void)。
然而,Java喜欢特殊!Java不会返回你在Main方法中返回的返回码,但它会在JVM退出时返回一些返回码(这适用于多线程程序),并且会返回System.Exit(returnCode);调用指定的返回码。

1

您没有获取退出状态, 退出状态是包含在$?中的。 您正在获取标准输出,即写入到System.out中的任何内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接