当我们在学校学习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)
是不好的做法(即:在主方法的最后一行写它)?
答案 0 :(得分:16)
Java的System.exit(0)
就像C ++中的exit(0)
后一点使它成为学术类型倾向于皱眉的“非结构化”控制流构造。 (在这种情况下,他们有一个很好的理由:如果函数通过异常(或旧式返回代码)报告失败,调用者可以从错误中恢复,但exit
会烧掉当然,有时候错误确实需要被视为致命的。)
在C ++中,return 0
等同于exit(0)
,如果它在main
函数中。 (在其他功能中,它并不意味着什么特别的。)
这里C ++和Java之间的相关差异是main
的返回类型。
main
必须返回int
。通常情况下,这意味着必须具有return
语句,但C ++标准使main
成为一个特殊情况,如果你是隐含return 0;
的结尾不要写一个。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)用于知道程序的执行是好还是坏。执行正常时使用0
。 1, -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)
。