Разница в системе. выход (0), System.exit (-1), System.exit (1) в Java

280

Я хотел бы знать разницу между следующим в Java

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

Когда я должен использовать вышеуказанный код надлежащим образом?

гири
источник
17
почему вы не отметили ответ как «лучший ответ», поэтому есть зеленая галочка? это помогает другим людям знать, что лучше!
Сакшам Гоял

Ответы:

253

Параметр выхода должен быть квалифицирован, если выполнение программы прошло хорошо или плохо. Это своего рода наследственность от старых языков программирования, где полезно знать, если что-то пошло не так и что пошло не так.

Код выхода

  • 0 когда казнь прошла нормально;
  • 1, -1, whatever != 0Когда произошла ошибка, вы можете использовать различные значения для разного рода ошибок.

Если я прав, коды выхода были просто положительными числами (я имею в виду в UNIX) и в соответствии с диапазоном:

  • 1-127пользовательские коды (генерируемые при вызове exit(n))
  • 128-255являются кодами, генерируемыми завершением из-за различных сигналов Unix, таких как SIGSEGV или SIGTERM

Но я не думаю, что вы должны заботиться при написании кода на Java, это всего лишь немного информации. Это полезно, если вы планируете, чтобы ваши программы взаимодействовали со стандартными инструментами.

разъем
источник
31
Также обратите внимание, что код завершения 0 считается как истинный в оболочке, а любой другой код считается ложным. Так java MyApp && echo successбудет выводиться «success», если MyApp имеет код выхода 0, т.е. если он вызывает exit(0)или просто достигает конца основного метода без ошибки.
sepp2k
16
Пожалуйста, всегда заботьтесь о коде выхода, если ваше приложение может быть использовано в скрипте. Очень раздражает, что в середине вашего скрипта происходит сбой инструмента (или вывод некоторой стековой трассировки и выход с 0).
Дончо Ганчев
6
Стоит отметить одну вещь: при возврате -1 наибольшее возможное положительное число возвращается в беззнаковом контексте (в представлении дополнения до двух -1 всегда устанавливаются все биты независимо от количества байтов в числе). Поэтому -1 обычно возвращается, когда вы возвращаете неспецифическую ошибку и не хотите, чтобы она конфликтовала с возможными кодами ошибок, которые уже определены и задокументированы. например, код ошибки 1 мог быть задокументирован как ошибка записи; код ошибки 2 может быть ошибкой чтения и т. д.
Nylon Smile
На самом деле это «своего рода наследственность» от Unix * exit (2) `.
Маркиз Лорн
127

Zero => Все хорошо

Positive => Что-то, что я ожидал, могло пойти не так, как надо (неправильно в командной строке, не удалось найти файл, не удалось подключиться к серверу)

Negative=> Что-то, чего я совсем не ожидал, пошло не так (системная ошибка - непредвиденное исключение - например, внешнее принудительное завершение kill -9)

(значения больше 128 на самом деле отрицательны, если вы рассматриваете их как 8-битный двоичный код со знаком или дополнение к двум)

Здесь есть множество хороших стандартных кодов выхода

Роберт
источник
12
«Что-то, что я ожидал, пошло не так, пошло не так» звучит как «Все в порядке».
тобе
«Вещи, которые я, как разработчик, могу разумно ожидать» User Error vs System Error; На самом деле это освещено верхним постером: значения 128-255 являются -ve относительно 8-битного двоичного со знаком
Роберт
6
@tobe Это действительно больше похоже на то, «что-то, что я ожидал, могло пойти не так, как надо, пошло не так»;)
Марсель Эрнандес
1
Bash рассматривает коды выхода как 8-битные без знака и будет модифицировать 256, поэтому значение -1 становится 255, а 256 становится 0. Сигналы (например, при уничтожении kill -15) часто приводят к коду выхода 128+signal, но (кроме 9) могут обрабатываться и вернуть другой код выхода. Значение -in kill -15помечает число как сигнал, а не как pid, оно не делает сигнал отрицательным.
Мэтью
Когда вы делаете, 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выше или для неудачных.

Premraj
источник
3
Этот ответ кажется противоречащим с ответом @ robert
amdev
В документе Java не упоминалось, что код выхода -1 представляет ОШИБКУ, вместо этого формулировка «статус - Статус завершения. По соглашению, ненулевой код состояния указывает на ненормальное завершение».
Дамит
EXIT_*не существует в Java.
juanchito
11

Ненулевой код состояния выхода, как правило, указывает на аварийное завершение. если n != 0, это до программиста, чтобы применить значение к различным п.

Из https://docs.oracle.com/javase/7/docs/api/java/lang/System.html .

Фредерик Ворденшельд
источник
6

exit(0)обычно используется для обозначения успешного завершения. exit(1)или exit(-1)или любое другое ненулевое значение указывает на неудачное завершение в целом.

Пурушоттам Садх
источник
Какой аргумент в пользу того, что аргумент передается кодером. Не возвращаемое значение методом. Как он может указывать результат завершения?
anKotliner
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

Хорошая ошибка: любой код ошибки> 255 будет преобразован в код ошибки% 256. Следует быть особенно осторожным с этим, если они используют собственный код ошибки> 255 и ожидают точный код ошибки в логике приложения. http://www.tldp.org/LDP/abs/html/exitcodes.html

кочевник
источник
1

разница чисел в system.exit () объясняется в других ответах. но НАСТОЯЩАЯ РАЗНИЦА заключается в том, что System.exit () - это код, который возвращается в вызывающий процесс. Если программа вызывается операционной системой, то код возврата сообщит ОС, что если system.exit () вернул 0, то все в порядке, но если что-то пошло не так, то в родительском процессе для этого могут быть некоторые обработчики.

Парса
источник
0

Поскольку другие отвечают 0смысл успеха, иначе.

Если вы используете bat-файл (окно) System.exit(x), эффект будет.

Код Java (MyApp):

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

}

файл bat:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --
Nguyên
источник
-2

System.exit (0) по соглашению, ненулевой код состояния указывает на ненормальное завершение.

System.exit (1) -Это означает, что завершение не удалось из-за какой-то ошибки

androminor
источник
Аргумент всегда «служит кодом состояния». Не только когда это ноль.
Маркиз Лорн
о да . извини, мой плохой EJP
андроминор
-7
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); и когда я нажимаю case 5, он корректно завершается, но когда я использую System.exit (1); и нажмите case 5, он завершается с ошибкой, и снова, когда я пытаюсь с case 15, он правильно завершает работу. Я узнал, что когда мы помещаем какой-либо аргумент int внутри аргумента, он указывает, что он берет символ из этой позиции, т.е. если я помещаю (4) что это означает взять 5-й символ из этой строки, если его (3), то это означает, что взять 4-й символ из этой введенной строки

Легенд Смертный
источник