Різниця в системі. вихід (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.