系统差异。Java中的exit(0),System.exit(-1),System.exit(1)


280

我想知道以下Java之间的区别

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

什么时候必须适当使用以上代码?


17
您为什么不将答案标记为“最佳答案”,所以有一个绿色的勾号?它可以帮助其他人知道最好的是什么!
Saksham Goyal

Answers:


252

如果程序执行的好坏,则exit参数应为合格。这是较早的编程语言的一种遗传,在这种情况下,了解是否出了什么问题以及出了什么问题是很有用的。

退出代码为

  • 0 执行良好时;
  • 1-1whatever != 0发生了一些错误时,可以为不同类型的错误使用不同的值。

如果我是正确的,退出代码过去只是正数(在UNIX中是我的意思),并根据范围:

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

但是我认为您在使用Java进行编码时不应该在意,这只是一些信息。如果您计划使程序与标准工具进行交互,这将很有用。


31
还要注意,退出代码0在shell中被视为true,而其他任何代码均被视为false。因此,java MyApp && echo success如果MyApp的退出代码为0,即如果它调用exit(0)或只是简单地到达main方法的末尾而没有错误,则将打印“成功” 。
sepp2k 2010年

16
如果您的应用程序可以在脚本中使用,请始终注意退出代码。让工具在脚本中间静默失败(或打印一些堆栈跟踪并以0退出)是非常令人讨厌的。
Doncho Gunchev 2014年

6
需要注意的一件事:返回-1时,在无符号上下文中返回最大可能的正数(在二进制补码表示中-1始终设置所有位,而与数字中的字节数无关)。因此,当您返回非特定的错误并且不希望它与已经定义和记录的可能的错误代码冲突时,通常会返回-1。例如,错误代码1可能已被记录为写入错误;错误代码2可能是读错误,等等
尼龙微笑

实际上,这是Unix的* exit(2)中的一种“遗传”。
罗恩侯爵

127

Zero =>一切都好

Positive =>我预期可能会出错的地方出错了(错误的命令行,找不到文件,无法连接到服务器)

Negative=>我根本没想到的事情出了问题(系统错误-意外的异常-外部强制终止,例如kill -9

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

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


12
“我预想会出错的地方出错了”的声音听起来像“一切正常”。

“我作为开发人员可以预料到的事情”用户错误与系统错误;实际上,这是最重要的内容:值128-255是-ve wrt 8位有符号二进制。
罗伯特2014年

6
@tobe真的更像是“我预料可能会出错的地方实际上出错了”;)
Marcel Hernandez

1
作为8位无符号,并且将国防部256,所以-1变为255和256变为0的信号(在一杀,例如击治疗退出代码kill -15)常常导致退出代码128+signal,但(除9)可被处理,并且返回一个不同的退出代码。在-kill -15是标记作为一个信号,而不是一个PID的数量,它不会使信号负。
马修(Matthew)

当您这样做时System.exit(-1),然后在外壳程序中echo $?得到“ 255”。这就是为什么我说负数是系统错误,而不是因为kill参数中的“-”。您是否认真考虑过我的想法?但是,感谢您解释Bash构造这些代码的机制。
罗伯特

51

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

Java上阅读更多内容

在Unix和Linux系统上,0用于成功执行,对于1更高级别,则用于失败执行。


3
这个答案似乎与
@robert

在Java文档中没有提到退出代码-1表示ERROR,而措辞是“状态-终止状态。按照惯例,非零状态代码表示异常终止。”
Damith

EXIT_*在Java中不存在。
juanchito


6

exit(0)通常用于指示成功终止。exit(1)exit(-1)任何其他非零值通常表示终止失败。


我的意思是,参数是由编码器传递的,而不是方法的返回值,它如何指示终止结果?
anKotliner '19

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


1

其他答案中解释了放在system.exit()中的数字的差异。但是真正的区别在于System.exit()是返回到调用过程的代码。如果操作系统正在调用该程序,则返回代码将告诉OS,如果system.exit()返回0表示一切正常,但如果没有出现问题,则父进程中可能有一些处理程序


0

其他人回答0意味着成功,否则。

如果使用bat文件(窗口)System.exit(x)将起作用。

代码Java(myapp):

if (error < 2){
    help();
    System.exit(-1);    
}
else{
    doSomthing();
    System.exit(0);
}

}

蝙蝠文件:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --

-2

按照惯例,System.exit(0),非零状态代码表示异常终止。

System.exit(1) -表示由于某些错误而无法成功终止


参数始终“用作状态码”。不仅是零。
洛恩侯爵,

哦,是的。对不起,我的EJP不好
androminor

-6
class calc{
public static void main(String args[])
{
    int a, b, c;
    char ch;
    do{

        Scanner s=new Scanner(System.in);

                System.out.print("1. Addition\n");
                System.out.print("2. Substraction\n");
                System.out.print("3. Multiplication\n");
                System.out.print("4. Division\n");
                System.out.print("5. Exit\n\n");

                System.out.print("Enter your choice : ");
                ch=s.next().charAt(0);
                    switch (ch)
                    {
                        case '1' :
                        Addition chose1=new Addition();
                        chose1.add();
                        break;

                        case '2' :
                        Substraction chose2=new Substraction();
                        chose2.sub();
                        break;

                        case '3' :
                        Multiplication chose3= new Multiplication();
                        chose3.multi();
                        break;

                        case '4' :
                        Division chose4=new Division();
                        chose4.divi();
                        break;

                        case '5' :
                        System.exit(0);
                        break;

                        default :
                        System.out.print("wrong choice!!!");
                        break;
                    }
        System.out.print("\n--------------------------\n");                     
    }while(ch !=5); 
}

}

在上面的代码中当其System.exit(0); 当我按案例5时,它会正确退出,但是当我使用System.exit(1)时;并按情况5它错误退出,并且当我尝试情况15它正确退出时我知道,每当我们将任何int放入参数时,它都会指定从该位置获取字符,即如果我把(4)表示从该字符串中取第5个字符,如果(3)则表示从该输入字符串中取第4个字符

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.