【发布时间】:2010-01-15 10:59:28
【问题描述】:
对于 C/C++ main() 必须始终返回一个整数(零表示成功,非零表示失败)。我可以理解这一点,因为程序运行它成为一个进程,每个进程都应该有一个退出状态,我们通过执行 echo $?进程结束后从 shell 中。
现在我不明白为什么 main 方法在 Java 中不返回任何内容?这与程序运行在JVM上,JVM进程负责返回退出状态有什么关系吗?
请澄清。
谢谢,
罗杰
【问题讨论】:
对于 C/C++ main() 必须始终返回一个整数(零表示成功,非零表示失败)。我可以理解这一点,因为程序运行它成为一个进程,每个进程都应该有一个退出状态,我们通过执行 echo $?进程结束后从 shell 中。
现在我不明白为什么 main 方法在 Java 中不返回任何内容?这与程序运行在JVM上,JVM进程负责返回退出状态有什么关系吗?
请澄清。
谢谢,
罗杰
【问题讨论】:
在多线程已经很普遍的时候设计的,java 说(按设计)“再见”“当'main'返回时程序完成的想法。这就是没有返回值的原因。正如其他人所说,当您想使用返回码退出时使用System.exit。
【讨论】:
如果单线程java应用程序的main方法终止,应用程序将以退出代码0终止。如果您需要另一个退出代码,可能表示错误,您可以放置
System.exit(yourNumberHere);
代码中的任何地方(尤其是在 main 方法之外)。
这对于多线程应用程序是不同的,您必须从外部使用kill -9 内部的System.exit 来停止JVM。
这是一个简单的示例,其中 main 的终止不会停止应用程序(典型的服务或守护程序行为):
public static void main(String args[]) {
Thread iWillSurvive = new Thread(new Runnable() {
public void run() {
while(true) {
// heat the CPU
}
}
});
iWillSurvive.start();
}
备注:当然,线程会在它的 run 方法(或主线程的 main 方法)终止时终止。在这种情况下,当所有线程都终止时,JVM 将以退出代码 0 终止(这让我们回到最初的问题)。希望大家现在都开心。
【讨论】:
Java 有 System.exit(int) 用于此目的。
基本上,如果程序流程到达 main 方法的末尾,Java 程序将以退出代码 0 退出(粗略地说;使用 Swing 和线程会变得更奇怪,但这应该足够了)。
如果您在某处(实际上是在任何地方)拨打System.exit() 或Runtime.getRuntime().exit()(这是System.exit() 所拨打的电话),则程序会立即提前结束。
你可以把它想象成 Java 会在 main 方法的最后隐式添加 System.exit(0),但可能会有更细微的差异。不过,我现在还没有 JVM 关闭的完整细节。
【讨论】:
0。
一个小问题 - 在 C++ 中,您不需要从 main 中返回任何内容:
int main() {
}
是一个完全合法的 C++ 程序 - 它就像你有:
return 0;
作为 main 中的最后一条语句。
【讨论】:
exit 值对于 bash 脚本或命令行操作等脚本很有用。 所以在这些情况下使用 System.exit()。
【讨论】:
我怀疑 C/C++ 返回 int 的原因是因为这是在这些语言中指示函数/方法/程序成功/失败的约定。
在 Java 中引入了异常,而不是零表示成功,非零值表示失败,它使用异常层次结构表示失败,成功只是在没有抛出异常时,因此无需返回值.
【讨论】:
main() 抛出异常没有用处,唯一的输出必须是返回码。 C 不支持 C 程序中的异常而 Java 支持 Java 程序这一事实并不影响这些异常与操作系统的交互方式。
我现在编写的大多数程序都有某种形式的用户界面,它们可以返回的东西很少,更不可能任何东西都需要那个状态码。
那么为什么要强制所有程序都返回一个呢?正如其他人所说,您可以根据需要返回状态码...
【讨论】:
可能是因为System.exit(int exitCode) 没有返回值。
【讨论】: