代码之家  ›  专栏  ›  技术社区  ›  gameover

主函数不返回任何内容。为什么?[复制品]

  •  11
  • gameover  · 技术社区  · 15 年前

    这个问题已经有了答案:

    对于C/C++Min(),必须总是返回一个整数(0表示成功和非零以指示失败)。我可以理解,当程序运行时,它变成一个进程,每个进程都应该有一个退出状态,这是我们通过执行echo$获得的。过程结束后从shell返回。

    现在我不明白为什么主方法不返回Java中的任何东西?它是否与程序在JVM上运行以及JVM进程可重新定位以返回退出状态这一事实有关?

    请澄清。

    谢谢,
    罗杰

    8 回复  |  直到 8 年前
        1
  •  14
  •   Andreas Dolk    15 年前

    如果主要方法 一个单线程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方法(或者主线程的main方法)终止时,它将终止。在这种情况下,当所有线程都终止时,JVM将以退出代码0终止(这使我们回到了最初的问题)。希望大家现在都开心。

        2
  •  16
  •   Kai Huppmann    15 年前

    设计多线程已经是一种常见的事情,Java说(按设计)“再见”的想法,当“主”返回程序完成。这就是为什么没有返回值的原因。正如其他人所说的使用 System.exit 当您想退出时返回代码。

        3
  •  7
  •   Joey Gumbo    15 年前

    爪哇有 System.exit(int) 为此目的。

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

    如果你打电话给 System.exit() (实际上)或 Runtime.getRuntime().exit() 这是什么 系统.退出() 调用,然后程序立即提前结束。

    你可以想象它会像Java一样暗中添加 System.exit(0) 在主要方法的最后,可能会有更细微的差异。不过,我现在还不知道JVM关闭的完整细节。

        4
  •  4
  •   anon    15 年前

    一个小的黑格——在C++中,你不需要从主文件返回任何东西:

    int main() {
    }
    

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

    return 0;
    

    最后一句话。

        5
  •  1
  •   Ben    10 年前

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

        6
  •  0
  •   Jack Leow    15 年前

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

    由于在Java中引入了异常,而不是成功的零和失败的非零值,它使用了异常的层次结构来进行失败,并且成功是在没有抛出异常的情况下完成的,从而消除了返回值的需要。

        7
  •  0
  •   jcoder    15 年前

    这些天我编写的大多数程序都有某种形式的用户界面,几乎没有什么可以有用地返回的,更不可能任何东西都需要状态代码。

    那么,为什么要强制所有程序返回一个呢?正如其他人所说,如果您希望…

        8
  •  0
  •   Richard J. Ross III    13 年前

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