主要功能不返回任何东西。为什么?

时间:2010-01-15 10:59:29

标签: java c++ c jvm

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

现在我不明白为什么main方法在Java中没有返回任何内容?是否与程序在JVM上运行并且JVM进程可以返回以返回退出状态这一事实有什么关系?

请澄清。

谢谢,
罗杰

7 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:14)

如果单线程java应用程序的主方法终止,则应用程序将以退出代码0终止。如果您需要另一个退出代码,可能表示错误,您可以放置​​

System.exit(yourNumberHere);

代码中的任何位置(特别是在主方法之外)。

对于多线程应用程序,这是不同的,您必须从外部使用System.exit内部的kill -9来停止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方法(或主线程的主方法)终止时终止。在这种情况下,当所有线程都已终止时,JVM将以退出代码0终止(这将我们带回到初始问题)。希望大家现在都快乐。

答案 2 :(得分:7)

为此目的,Java有System.exit(int)

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

如果您在System.exit()某处(实际上是任何地方)或Runtime.getRuntime().exit()调用了System.exit(),那么该程序会立即过早结束。

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

答案 3 :(得分:4)

一个小问题 - 在C ++中,你不需要从main返回任何东西:

int main() {
}

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

return 0;

作为主要的最后一句话。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

在Java中引入了Exceptions,而不是成功的零和失败的非零值,它使用异常层次结构来表示失败,并且只是在没有抛出异常的情况下成功,因此无需返回值

答案 6 :(得分:0)

我现在写的大多数程序都有某种形式的用户界面,而且它们可以很有用地返回,甚至不太可能每个人都需要这些状态代码。

那么为什么要强制所有程序返回一个呢?正如其他人所说,如果您愿意,可以返回状态代码......