main 函数不返回任何内容。为啥? [复制]

Posted

技术标签:

【中文标题】main 函数不返回任何内容。为啥? [复制]【英文标题】:main function does not return anything. Why? [duplicate]main 函数不返回任何内容。为什么? [复制] 【发布时间】:2010-01-15 10:59:28 【问题描述】:

对于 C/C++ main() 必须始终返回一个整数(零表示成功,非零表示失败)。我可以理解这一点,因为程序运行它成为一个进程,每个进程都应该有一个退出状态,我们通过执行 echo $?进程结束后从 shell 中。

现在我不明白为什么 main 方法在 Java 中不返回任何内容?这与程序运行在JVM上,JVM进程负责返回退出状态有什么关系吗?

请澄清。

谢谢, 罗杰

【问题讨论】:

【参考方案1】:

在多线程已经很普遍的时候设计的,java 说(按设计)“再见”“当'main'返回时程序完成的想法。这就是没有返回值的原因。正如其他人所说,当您想使用返回码退出时使用System.exit

【讨论】:

简而言之就是这样。【参考方案2】:

如果单线程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 终止(这让我们回到最初的问题)。希望大家现在都开心。

【讨论】:

你的意思是说,如果我的程序中没有 System.exit(),JVM 会用 0 添加它。如果我的程序有一个非零值的显式调用,它会被用作退出状态? 如果 main 方法终止,Java 进程确实不一定必须终止,因此(正如 kai1968 指出的那样)从 main 方法返回进程的退出代码是不合理的。 还是错了。不需要使用 kill 或 System.exit 之类的工具来停止多线程 Java 应用程序。提示:即使是最简单的“Hello world”Java 应用程序也是多线程的(Java VM 会针对不同的管理问题启动自己的线程)并在 main 方法完成后退出。 jarnbjo - 我想知道就够了。提及“kill”(顺便说一句,语法错误,因为您必须识别过程)旨在成为一个幽默的补充。当然,您可以设计一个线程以使其终止或可以以适当的方式终止。 (但我会删除这部分,如果它让你更快乐)【参考方案3】:

Java 有 System.exit(int) 用于此目的。

基本上,如果程序流程到达 main 方法的末尾,Java 程序将以退出代码 0 退出(粗略地说;使用 Swing 和线程会变得更奇怪,但这应该足够了)。

如果您在某处(实际上是在任何地方)拨打System.exit()Runtime.getRuntime().exit()(这是System.exit() 所拨打的电话),则程序会立即提前结束。

你可以把它想象成 Java 会在 main 方法的最后隐式添加 System.exit(0),但可能会有更细微的差异。不过,我现在还没有 JVM 关闭的完整细节。

【讨论】:

我们不会在每个 Java 程序的末尾都写这个,对吧? 如果您不希望异常返回,不。像往常一样,隐式退出代码是0 你的意思是说,如果我的程序中没有 System.exit(),JVM 会用 0 添加它。如果我的程序有一个非零值的显式调用,它会被用作退出状态? codaddict:大概,是的。我扩展了我的答案。【参考方案4】:

一个小问题 - 在 C++ 中,您不需要从 main 中返回任何内容:

int main() 

是一个完全合法的 C++ 程序 - 它就像你有:

return 0;

作为 main 中的最后一条语句。

【讨论】:

我来这里是为了说这个。在这种情况下,标准不要求您返回 void 总是让我感到惊讶,实际上您不允许以这种方式声明它。但这就是它的工作原理【参考方案5】:

exit 值对于 bash 脚本或命令行操作等脚本很有用。 所以在这些情况下使用 System.exit()。

【讨论】:

【参考方案6】:

我怀疑 C/C++ 返回 int 的原因是因为这是在这些语言中指示函数/方法/程序成功/失败的约定。

在 Java 中引入了异常,而不是零表示成功,非零值表示失败,它使用异常层次结构表示失败,成功只是在没有抛出异常时,因此无需返回值.

【讨论】:

除了从main() 抛出异常没有用处,唯一的输出必须是返回码。 C 不支持 C 程序中的异常而 Java 支持 Java 程序这一事实并不影响这些异常与操作系统的交互方式。【参考方案7】:

我现在编写的大多数程序都有某种形式的用户界面,它们可以返回的东西很少,更不可能任何东西都需要那个状态码。

那么为什么要强制所有程序都返回一个呢?正如其他人所说,您可以根据需要返回状态码...

【讨论】:

什么是强制程序返回状态码?【参考方案8】:

可能是因为System.exit(int exitCode) 没有返回值。

【讨论】:

我没有将现有帖子视为答案,因此我编辑了帖子以使其更像是答案而不是问题。

以上是关于main 函数不返回任何内容。为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Rust 在 main 函数中没有返回值,以及如何返回值?

为啥 ioctl I_SENDFD 不返回任何权限(EPERM)? [复制]

为啥从 main() 显式返回 0 被认为是好的做法? [复制]

在重载时为啥不考虑函数的返回类型? [复制]

为啥包含类的名称不被识别为返回值函数注释? [复制]

为啥 getLastRequest 不返回任何内容?