Java的System.exit(0); vs C ++返回0;

时间:2014-06-25 06:25:12

标签: java c++ return exit

当我们在学校学习C ++时,我们的教授会告诉我们在主函数的最后一行代码中写return 0;,它被认为是一种很好的编程实践。

在Java中,我意识到有些人在主方法的最后一行写了System.exit(0);

然而,在C ++中,如果我使用exit(0);我的教授会受到惩罚,因为(在学校里)进行程序编程,我们应该让程序流到主程结束并让程序停止自然。

我的问题:Java的System.exit(0);是否与C ++ return 0;相似? (或者它类似于C ++' s exit(0)

在不需要的时候在java中使用System.exit(0)是不好的做法(即:在主方法的最后一行写它)?

5 个答案:

答案 0 :(得分:16)

Java的System.exit(0)就像C ++中的exit(0)

  • 终止流程
  • 可以从程序中的任何地方调用。

后一点使它成为学术类型倾向于皱眉的“非结构化”控制流构造。 (在这种情况下,他们有一个很好的理由:如果函数通过异常(或旧式返回代码)报告失败,调用者可以从错误中恢复,但exit会烧掉当然,有时候错误确实需要被视为致命的。)

在C ++中,return 0等同于exit(0) ,如果它在main函数中。 (在其他功能中,它并不意味着什么特别的。)

这里C ++和Java之间的相关差异是main的返回类型。

  • 在C ++中,main必须返回int。通常情况下,这意味着必须具有return语句,但C ++标准使main成为一个特殊情况,如果你是隐含return 0;的结尾不要写一个。
  • 在Java中,main必须返回void

在C ++中,在return中编写main语句是很常见的,即使它在技术上是多余的,因为它与程序中所有其他非void函数的风格一致。

在Java中,您不能return main的退出代码,因为它是void函数。因此,如果要显式指定退出代码,则必须使用System.exit

使用main结束每个Java System.exit(0)函数并不是错误,但除非你有像

这样的结构,否则它不是惯用的
public static void main(String[] args) {
   try {
       //... do the work
       System.exit(0);
   } catch (Throwable t) {
       //... report the error
       System.exit(1);
   }
}

答案 1 :(得分:6)

在Java System.exit(0),System.exit(1)中,System.exit(-1)用于知道程序的执行是好还是坏。执行正常时使用01, -1, whatever != 0发生错误时,您可以针对不同类型的错误使用不同的值。

你也可以这样说:

0 表示一切正常

1 意味着我期待出错的事情出错了

-1 意味着我没想到会出错

Java Doc说:

  

该参数用作状态代码;按照惯例,非零状态   代码表示异常终止。


  

是Java的System.exit(0);类似于C ++的返回0; ?

是的,它们都很相似。

  

在java中使用System.exit(0)是不好的做法   不必要

我不会说这是一种不好的做法,但是你应该知道何时使用它以及在何处使用它。您可以使用它通过退出代码为命令行工具抛出错误,而不是抛出异常。 System.exit(0)终止JVM,因此您应该非常确定在何处使用它。

一个例子:

try {  
    runTheWholeApplication();  
    System.exit(0);  // Signifying the normal end of your program
} catch (Throwable t) {  
    reportErrorSomehow(t);  
    System.exit(1);  // Signifying that there is an error
}

答案 2 :(得分:4)

  

当我们在学校学习C ++时,我们的教授会告诉我们在主函数的最后一行代码中写return 0;,它被认为是一种很好的编程实践。

这是值得商榷的。他是否也告诉过你return 0;内隐含main?就个人而言,我从来没有在return 0;内写出多余的main,我几乎从未在其他人的代码中看到它。

答案 3 :(得分:3)

是。 Java的System.exit(0);是直接类比,因为原型Java main方法被定义为

public static void main(String[] args) {
}

所以它实际上不能return int(尽管它可以简单地return;)。在C ++中,你可以exit(0);也是等价的。

答案 4 :(得分:3)

原始操作系统Unix严重依赖于使用和组合许多小程序的命令行脚本。程序的返回码用于控制流程。返回代码0表示一切正常,错误不为零。

所以 C int main(...)是直接映射,最后return 0;适当。那里的出口就像抛出异常,绕过任何回报。它还禁止从另一个程序调用main。

Java public void main(...)中,这是简化的,0是隐含的。 System.exit(0);有一个错误的假设,即没有其他程序调用{​​{1}}。虽然通常main镜像了99%的使用率,但现在void对于非零错误代码是不可避免的。

这也必须被视为更一般的设计决策; C很大程度上依赖于函数的返回码,这使得控制流程变得困难或容易出错,因此Java引入了Exceptions的使用作为可能的强制控制流程,并且可以自由选择捕获。如今,System.exit(...);的替代方案可能是System.exit(13)