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

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

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

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

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

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

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

  • 它终止了这个过程
  • 它可以从程序的任何地方调用。

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

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

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

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

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

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

使用System.exit(0)结束每个Java main函数并没有 ,但除非你有一个像这样的结构,否则它不是惯用的

 public static void main(String[] args) { try { //... do the work System.exit(0); } catch (Throwable t) { //... report the error System.exit(1); } } 

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

你也可以这样说:

0意味着一切都好

1意味着我期待出错的东西出了问题

-1表示我没想到会出错的东西

Java Doc说:

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


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

是的他们都很相似。

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

我不会说这是一个不好的做法,但是你应该知道何时使用它以及在哪里使用它。 您可以使用它通过退出代码为命令行工具抛出错误,而不是抛出exception。 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 } 

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

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

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

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

所以它实际上不能return一个int (虽然它可以简单地return; )。 在C ++中你可以exit(0); 这也是等价的。

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

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

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

这也必须被视为更一般的设计决策; C严重依赖函数的返回码,这使得控制流程变得困难或容易出错,因此Java引入了Exceptions作为可能的强制控制流程的使用,并且可以自由选择捕获。 现在, System.exit(13)的替代方法可能是throw new IllegalArgumentException("Unlucky");