在Java中,System.exit(0),System.exit(-1)和System.exit(1)之间有什么区别?

308

我想知道在Java中以下内容的区别:

System.exit(0);
System.exit(-1);
System.exit(1);

我什么时候需要适当使用上述代码?


20
为什么你没有将答案标记为“最佳答案”,这样就会有一个绿色的勾勾?这可以帮助其他人知道哪个是最好的答案!! - Saksham Goyal
12个回答

271

exit的参数应该能够判断程序的执行是否成功。这是从早期编程语言遗留下来的一种习惯,因为知道是否出现了问题以及出了什么问题很有用。

退出代码是

  • 0 表示执行良好;
  • 1, -1, whatever != 0 表示发生错误,您可以使用不同的值表示不同类型的错误。

如果我没记错的话,在UNIX中退出码只是正数(我的意思是),按范围分为:

  • 1-127 是用户定义的代码(通过调用 exit(n)生成)
  • 128-255 是由于不同unix信号的终止而生成的代码,例如SIGSEGVSIGTERM

但我认为在Java编程时不需要关心这些,这只是一点信息。如果您计划让您的程序与标准工具交互,则这很有用。


35
注意,Shell 中退出码为 0 表示为真,任何其他代码都表示为假。因此,只有当 java MyApp && echo success 命令的 MyApp 退出码为 0 时,即它调用了 exit(0) 或在主方法结束时没有错误时,才会打印出 "success"。 - sepp2k
20
请务必关注退出代码,如果您的应用程序可用于脚本,请确保它能够在脚本中正常运行。在脚本执行过程中,工具默默失败(或打印一些堆栈跟踪并以0退出)会非常烦人。 - Doncho Gunchev
6
需要注意的一点是:当返回-1时,在无符号上下文中会返回最大可能的正数(在二进制补码表示中,-1总是设置所有位,不考虑数字中字节的数量)。因此,通常在返回非特定错误并且不希望与已定义和记录的可能的错误代码冲突时,会返回-1。例如,错误代码1可能已被记录为写入错误;错误代码2可能是读取错误等。 - Nylon Smile
这实际上是从Unix的*exit(2)继承而来的。 - user207421

142

=> 一切正常

正数 => 我预期的某些事情可能会出错(错误的命令行、找不到文件、无法连接服务器)

负数 => 我完全没有预料到的事情出错了(系统错误 - 意外异常 - 外部强制终止,例如kill -9

(如果您将它们视为8位有符号二进制或二进制补码,则大于128的值实际上是负数)

这里有很多好的标准退出代码


16
“我本以为会出问题的事情果然出了问题”,听起来像是“一切都好”。 - tobe
作为开发人员,我可以合理地预期的事情包括:用户错误和系统错误。这实际上已经在置顶帖中涵盖了:128-255 值针对 8 位有符号二进制是负数。 - robert
7
@tobe,这句话的意思更像是“我预料到可能会出错的事情实际上出错了”;) - Marcel Hernandez
1
Bash将退出代码视为8位无符号数,并对256取模,因此-1变为255,256变为0。信号(在kill中,例如kill -15)通常导致退出代码为128+signal,但是(除了9之外)可以处理并返回不同的退出代码。kill -15中的“-”标记数字为信号而不是pid,它不会使信号变为负数。 - Matthew
当你执行 System.exit(-1),然后在你的 shell 中输入 echo $?,你会得到 '255'。这就是为什么我说负数是系统错误的原因,而不是因为 kill 参数中有 '-'。你真的认为我是这么想的吗?但是感谢你解释了 Bash 构建这些代码的机制。 - robert
显示剩余2条评论

58

System.exit(system call)用于终止当前正在运行的Java虚拟机,启动其关闭序列。参数充当状态码

按照惯例,非零状态码表示异常终止。

  System.exit(0) or EXIT_SUCCESS;  ---> Success
  System.exit(1) or EXIT_FAILURE;  ---> Exception
  System.exit(-1) or EXIT_ERROR;   ---> Error

在Unix和Linux系统中,0表示执行成功,1或更高表示执行失败。

阅读更多请访问Java


3
这个回答似乎与@robert的回答存在矛盾。 - amdev
Java文档中并未提到退出代码-1表示错误,而是使用“状态 - 终止状态”的措辞。按照惯例,非零状态码表示异常终止。 - Damith
EXIT_* 在Java中不存在。 - juanchito

11

8

exit(0) 一般用于表示成功终止。而 exit(1) 或者 exit(-1) 或者其他非零值则是一般表示未成功终止。


让我困惑的是参数是由编码者传递的,而不是方法返回值。它如何指示终止结果? - linjiejun

4

这是答案。

System.exit(0);// normal termination - Successful - zero
System.exit(-1);//Exit with some Error
System.exit(1);//one or any positive integer // exit with some Information message

2
一个好的"gotcha"是任何错误代码>255将被转换为错误代码%256。如果使用自定义错误代码>255并期望在应用程序逻辑中获得确切的错误代码,则应特别小心。 http://www.tldp.org/LDP/abs/html/exitcodes.html

1

System.exit(0) 按照惯例,零状态码表示成功终止。

System.exit(1) -这意味着由于某些错误而未能成功终止。


该参数始终“作为状态码”。不仅当它为零时。 - user207421
哦,是的。抱歉,我的错,EJP。 - androminor

1

在其他答案中已经解释了放在system.exit()中的数字的区别。但是真正的区别在于,System.exit()是一个返回给调用进程的代码。如果程序由操作系统调用,则返回代码将告诉操作系统,如果system.exit()返回0,则一切正常,但如果不是,则出现了问题,那么父进程中可能会有一些处理程序。


0

看下面的代码

public static void main(String[] args) {
    **String s=null;**
    try {
        System.out.println("Exit");
        System.exit(1);
        **s.length();**
    }catch(Exception e) {
        System.out.println("Exception");
    }finally {
        System.out.println("finally");
    }}

这里exit(0):通常用于表示成功终止。 exit(1)或exit(-1)或任何其他非零值-通常表示不成功的终止。 无论您传递什么参数,控制流始终会出来,并且不会打印任何下一个内容,无论是捕获块还是finally,因为s.length在此处将抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接