当我们在学校学习C++时,我们的教授会告诉我们在main函数的最后一行代码中写EDOCX1 0,它被认为是一个很好的编程实践。
在爪哇,我意识到有些人在主方法的最后一行写System.exit(0);。
但是,在C++中,如果我使用EDCOX1,2,我会被我的教授惩罚,因为(在学校里)对于程序编程,我们希望让程序流到主体的末尾,让程序自然停止。
我的问题是:Java的EDOCX1 1是类似于C++的EDOCX1?0的吗?(或者它类似于C++的EDOCX1?5)
在不必要的情况下,在Java中使用EDCOX1第6条是不好的做法吗?(即:将它写入主方法的最后一行)?
- 这是相当切合实际的,作为一个"老派"开发人员,我被教导有一个入口点和一个出口点(谈论函数和方法),但这也适用于System.exit。在代码中使用该语句的问题与在函数/方法中使用多个return语句的问题相同,它们很容易被忽略,并且可能使理解代码变得更加困难。尽管如此,每一条规则都有例外,有些项目可能需要您终止正在运行的程序的中游……但我仍然在寻找避免它的方法……
- 我从来没有在主方法的最后一行使用过System.exit(0);。
- "安基兰巴",很像C++,一个是默默添加的。
- 也许这个问题有助于解释:stackoverflow.com/q/3715967/3651800
- @Mattcoubrough我刚从你粘贴的链接中回来。
- @用户3437460那么你应该在你的问题中提到这一点,并声明它没有为你澄清问题。
- 在Java中EDCOX1的2Ω等于EDCOX1〔4〕,在C EDOCX1中,5Ω或EDCOX1,6在Java中等于EDCOX1,5,或EDCOX1,6,在C.出口中关闭整个过程,而返回只是退出子程序或函数。
Java的EDCOX1的8度类似于C++中的EDCOX1×23。
后一点使其成为学术界人士往往不喜欢的"非结构化"控制流结构。(在这种情况下,它们有一个很好的理由:如果函数通过异常(或老式的返回代码)报告失败,调用方就有可能从错误中恢复过来,但exit会烧掉这座桥。当然,有时错误确实需要被视为致命的。)
在C++中,EDCOX1的25Ω等于EDCOX1,23,如果它在EDCOX1×1函数中。(在其他函数中,它并不意味着什么特殊的东西。)
C++和Java之间的不同之处在于EDCOX1的返回类型1。
- 在C++中,EDCOX1〔1〕必须返回EDCOX1〔3〕。通常,这意味着它必须有一个EDCOX1×2Ω语句,但是C++标准使EDCOX1(1)成为一个特殊的情况,如果不写EDCOX1,则将EDCOX1作为9的结尾。
- 在爪哇中,main必须返回EDCX1〔18〕。
在C++中,通常在EDOCX1×1中编写EDCOX1×2个语句,尽管它在技术上是冗余的,但与程序中所有其他非EDCOX1、18个函数的风格一致。
在爪哇中,EDOCX1和2不能从EDOCX1 1的出口代码中退出,因为它是EDCOX1×18的函数。因此,如果要显式地指定退出代码,则必须使用System.exit。
用EDOCX1,8来结束每个Java EDCOX1 1函数都是错误的,但是除非你有一个类似的构造,否则它是不习惯的。
1 2 3 4 5 6 7 8 9
| public static void main (String[] args ) {
try {
//... do the work
System. exit(0);
} catch (Throwable t ) {
//... report the error
System. exit(1);
}
} |
- 如果您的应用程序使用非守护进程线程的时间超过了主线程的生存期,那么用exit结束main方法是错误的。
- 那么,在Java中设置退出代码的正确方法是什么?先加入所有非守护进程线程,然后退出(1)?
- 不会退出(0)混乱与RAII?在MAIN中打开的文件/套接字等可能无法正确刷新其输出。
- JaseFX:Java没有RAII。必须显式关闭文件/套接字等。(不过,该语言的最新版本有一个try—带有资源结构,类似于c using,这使得这变得更加方便。)
- "DAN04",我想我是在引用主要部分的C++退出(0)。主出口(0)可以防止静态对象的析构函数运行,这可能导致文件、套接字等未刷新。
在Java系统.Exchange(0)中,System .EXIT(1),System .Exchange(-1)用于知道程序的执行是否是好的或坏的。执行良好时使用0。1, -1, whatever != 0当发生某些错误时,可以对不同类型的错误使用不同的值。
你也可以这样说:
0表示一切正常
1表示我希望出错的地方出错了。
-1表示我没想到会出问题的东西。
Java文档说明:
The argument serves as a status code; by convention, a nonzero status
code indicates abnormal termination.
Is Java's System.exit(0); similar to C++'s return 0; ?
是的,它们都很相似。
Is it bad practice to use System.exit(0) in java when it is
unnecessary
我不会说这是一个糟糕的做法,但是的,你应该知道什么时候使用它,在哪里使用它。您可以使用它通过退出代码为命令行工具抛出错误,而不是抛出异常。System.exit(0)终止了JVM,所以您应该非常确定在哪里使用它。
例如:
1 2 3 4 5 6 7
| 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++的EDCOX1×2。那么也许我们应该避免使用它,除非我们正在用线程等编写程序?
- @用户3437460是。是一样的。
- 在POSIX系统上,退出代码是一个8位无符号整数。您可以返回-1,但它被解释为255(由于2的补码)。
When we learn C++ in school, our professor will tell us to write return 0; at the last line of codes in the main function and it is considered as a good programming practice.
这是有争议的。他有没有告诉过你,return 0;隐含在main里面?就我个人而言,我从来没有在main中编写过多余的return 0;,而且我也几乎从未在其他人的代码中看到过它。
- 是的,因为我在C89上学到了,如果你不指定,它可以从main返回非零:stackoverflow.com/questions/12936473/…
最初的操作系统Unix非常依赖使用和组合许多小程序的命令行脚本。程序的返回代码用于控制流。返回代码0表示一切正常,错误为非零。
因此,c int main(...)是一个直接映射,而return 0;在最后是合适的。一个出口就像抛出一个异常,绕过任何返回。它还禁止从另一个程序调用主程序。
在Java EDCOX1中,15是简化的,0是隐式的。System.exit(0);有同样的坏假设,即没有其他程序调用main。虽然一般来说,void反映了99%的使用率,但现在System.exit(...);对于非零错误代码是不可避免的。
这也必须被视为一个更一般的设计决策;C很大程度上依赖于函数的返回代码,这使得控制流变得困难或容易出错,因为Java引入了异常作为可能的强制控制流的使用,具有可自由选择的catch。现在,替代System.exit(13)的可能是throw new IllegalArgumentException("Unlucky");。
- 因此,在你看来,在Java主行的最后一行中使用EDCOX1 3是坏的做法吗?
- @用户3437460:-不,这不是一个坏习惯。我将解释一个场景,比如当您编写批处理脚本或shell脚本时,脚本运行的每个程序在退出时都有一个错误代码。通常,如果错误代码为零,则无需采取任何措施,但如果错误代码为非零,则可能需要编写一个例程来处理它,即使它只是过早退出。因此,在这种情况下,使用System.exit()不是一个坏主意
- 是的,多余的,做更多的工作,如x = x;或return;。注意,对于使用这些返回代码的程序,它可能被视为文档:提示。
- @Joopegen感谢您的回复,您的解决方案比其他解决方案更深入。+ 1 from me
- @用户3437460你也是对的;但是一个JVM程序出口通常返回0,所以不需要显式地写它;就像在一个空函数的末尾写return;一样,这是一个不确定的程序员的标志。但是如上所述,它可以是样式,列出所有的System.exit(...)。
对。Java的EDCOX1×0是一个直接的模拟,因为原型Java EDCOX1×1方法被定义为
1 2
| public static void main (String[] args ) {
} |
因此,它实际上不可能是return或int(尽管它可以是return;)。在C++中,你可以使用EDCOX1×5,这也是等价的。
- …那么return;呢?
- @安基特兰巴编辑。对。你可以简单地用return。