为什么在未捕获的异常之后Java成功退出?


24

每当Perl,Python,C ++或Tcl程序因未处理的异常而暂停时,这些语言运行时都会注意为该过程注册一个非零的退出代码。如果基于Eclipse的程序在启动过程中失败,则它们也会返回1。java.exe但是,由标准运行的程序无论终止多么突然,都会很高兴地返回零,除非程序System.exit()使用退出值进行调用。甚至AssertionFailedErrorUnsatisfiedLinkError作为成功退出被报告回调用程序。

当然,并非所有系统都具有程序返回码,但是Unix和Windows非常重要,足以保证java.lang.Process.exitValue()子进程的运行。他们还不保证为父流程遵守约定吗?

这是语言设计上的缺陷还是仅仅是实现上的缺陷?是否有争论说这是个好主意?


不知道这是否更适合StackOverflow ...不过只是一个意见。
gablin

@gablin Mmm,的确,我开始在SO上写这个问题,然后改变了主意并将其张贴在这里。
詹姆斯

4
如果引发未捕获的异常,则Java 6Java 7中java命令似乎都以非零的退出代码响应。
dimo414

Answers:


28

如果Java语言规范没有明确定义期望的退出值,则它是未定义的,您不应依赖它。

您需要在主方法中捕获Throwable,然后自己调用System.exit(1)。


8
那么将其保留为未定义不是一个缺点吗?
詹姆斯

3
也许吧,也许不是。唯一重要的是JLS所说的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.