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


280

Я хотів би знати різницю між наступними в Java

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

Коли мені належним чином використовувати вищезазначений код?


17
чому ти не позначив відповідь «найкращою відповіддю», тому є зелений галочок? це допомагає іншим людям знати, що найкраще !!
Saksham Goyal

Відповіді:


252

Параметр виходу повинен відповідати, якщо виконання програми пішло добре чи погано. Це свого роду спадковість від старих мов програмування, де корисно знати, якщо щось пішло не так і що пішло не так.

Вихідний код є

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

Якщо я правильний, вихідні коди були просто позитивними цифрами (я маю на увазі в UNIX) і відповідно до діапазону:

  • 1-127- це визначені користувачем коди (так генеруються дзвінками exit(n))
  • 128-255- це коди, згенеровані термінацією через різні сигнали unix, такі як SIGSEGV або SIGTERM

Але я не думаю, що вам слід не хвилюватися під час кодування на Java, це лише трохи інформації. Це корисно, якщо ви плануєте взаємодія ваших програм зі стандартними інструментами.


31
Також зауважте, що вихідний код 0 вважається істинним в оболонці, а будь-який інший код вважається помилковим. Таким чином java MyApp && echo successбуде надруковано "успіх" iff MyApp має вихідний код 0, тобто якщо він викликає exit(0)або просто доходить до кінця основного методу без помилок.
sepp2k

16
Будь ласка, завжди дбайте про вихідний код, якщо ваш додаток можна використовувати в сценарії. Дуже прикро мати інструмент, який мовчки виходить з ладу в середині сценарію (або друкує якийсь слід стека і виходить з 0).
Дончо Гунчев

6
Варто зазначити одне: при поверненні -1 максимально можливе додатне число повертається в непідписаному контексті (у представленні комплементу двох -1 завжди встановлюється всі біти незалежно від кількості байтів у кількості). Отже -1 зазвичай повертається, коли ви повертаєте неспецифічну помилку, і не хочете, щоб вона стикалася з можливими кодами помилок, які вже визначені та задокументовані. наприклад, код помилки 1, можливо, був задокументований як помилка запису; код помилки 2 може бути прочитаний помилкою тощо
Нейлонова посмішка

Це насправді "різновид спадковості" від виходу * (2) `Unix '.
Маркіз Лорн

127

Zero => Все гаразд

Positive => Щось, що я очікував, може потенційно піти не так (неправильний командний рядок, не вдається знайти файл, не вдалося підключитися до сервера)

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

(значення, що перевищують 128, насправді від’ємні, якщо ви розглядаєте їх як 8-бітові підписані двійкові або доповнення двійки)

Тут є багато хороших стандартних кодів виходу


12
"Щось я очікував, що піде не так", звучить як "Все гаразд".
tobe

"Речі, на які я як розробник можна обґрунтовано передбачити" Помилка користувача проти системної помилки; Це насправді висвітлено у верхньому плакаті: значення 128-255 є -ve wrt 8-бітним двійковим файлом, підписаним.
Роберт

6
@tobe Це насправді більше на кшталт "Щось, на що я очікував, може піти не так, насправді не так";)
Марсель Ернандес

1
Bash розглядає вихідні коди як 8-бітові неподписані, і буде mod 256, тому -1 стає 255, а 256 стає 0. Сигнали (в убивстві, наприклад kill -15) часто призводять до виходу коду 128+signal, але (крім 9) можна обробляти і повернути інший вихідний код. -У kill -15це число знаків в якості сигналу , а не ФІД, він не робить негативний сигнал.
Матвій

Коли ви робите, 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
amdev

У документі java doc не зазначено, що код виходу -1 являє собою ПОМИЛКУ, замість цього формулювання "статус - статус припинення. За умовою, ненульовий код статусу вказує на аномальне припинення".
Деміт

EXIT_*не існує на Java.
juanchito


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 --

-2

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

System.exit (1) - Це означає, що припинення невдале через деяку помилку


Аргумент завжди "служить кодом статусу". Не тільки тоді, коли він дорівнює нулю.
Маркіз Лорн

о, так . вибачте мій поганий EJP
androminor

-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); і коли я натискаю регістр 5, він закінчується належним чином, але коли я використовую System.exit (1); і натисніть випадок 5, він виходить із помилкою, і знову, коли я намагаюся зі справою 15, він закінчується належним чином цим, я повинен знати, що коли-небудь ми ставимо будь-який внутрішній аргумент, він вказує, що він приймає символ з цієї позиції, тобто якщо я поставив (4) що означає взяти 5-й символ із цієї рядки, якщо його (3), то це означає взяти 4-й символ із цієї введеної рядки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.