Różnica w systemie. exit (0), System.exit (-1), System.exit (1) w Javie

280

Chciałbym poznać różnicę między poniższymi w Javie

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

Kiedy muszę odpowiednio użyć powyższego kodu?

Giri
źródło
17
dlaczego nie zaznaczyłeś odpowiedzi jako „najlepszej odpowiedzi”, więc jest zielony tyk? pomaga innym ludziom wiedzieć, co jest najlepsze !!
Saksham Goyal,

Odpowiedzi:

252

Parametr exit powinien się kwalifikować, jeśli wykonanie programu przebiegło dobrze lub źle. Jest to swego rodzaju dziedziczenie ze starszych języków programowania, w których warto wiedzieć, czy coś poszło nie tak i co poszło nie tak.

Kod zakończenia to

  • 0 kiedy egzekucja poszła dobrze;
  • 1, -1, whatever != 0Gdy wystąpił jakiś błąd, można użyć różnych wartości dla różnego rodzaju błędów.

Jeśli mam poprawne kody wyjściowe były zwykłymi liczbami dodatnimi (mam na myśli w systemie UNIX) i zgodnie z zakresem:

  • 1-127 to kody zdefiniowane przez użytkownika (generowane przez wywołanie exit(n) )
  • 128-255to kody generowane przez zakończenie z powodu różnych sygnałów uniksowych, takich jak SIGSEGV lub SIGTERM

Ale nie sądzę, że powinieneś przejmować się kodowaniem w Javie, to tylko trochę informacji. Jest to przydatne, jeśli planujesz, aby twoje programy współdziałały ze standardowymi narzędziami.

Jacek
źródło
31
Zauważ też, że kod wyjścia 0 liczy się w powłoce jako prawda, a każdy inny kod liczy się jako fałsz. Tak więc java MyApp && echo successwypisze „sukces” iff MyApp ma kod wyjścia 0, tzn. Jeśli wywołuje exit(0)lub po prostu osiąga koniec głównej metody bez błędu.
sepp2k
16
Zawsze pamiętaj o kodzie wyjścia, jeśli Twoja aplikacja może być używana w skrypcie. Bardzo denerwujące jest to, że narzędzie po cichu zawodzi w środku skryptu (lub drukuje jakieś ślady stosu i wychodzi z 0).
Doncho Gunchev
6
Należy zwrócić uwagę na jedną rzecz: zwracając -1, zwracana jest największa możliwa liczba dodatnia w kontekście bez znaku (w reprezentacji uzupełnienia dwóch -1 zawsze ustawia wszystkie bity niezależnie od liczby bajtów w liczbie). Więc -1 jest zwykle zwracane, gdy zwracasz niespecyficzny błąd i nie chcesz, aby kolidował z możliwymi kodami błędów, które są już zdefiniowane i udokumentowane. np. kod błędu 1 mógł zostać udokumentowany jako błąd zapisu; kod błędu 2 może być odczytany błąd itp.
Nylon Smile
W rzeczywistości jest to „dziedziczność” po wyjściu z Unixa * (2).
Markiz Lorne
127

Zero => Wszystko w porządku

Positive => Coś, czego się spodziewałem, mogło pójść nie tak, poszło nie tak (zły wiersz poleceń, nie można znaleźć pliku, nie można połączyć się z serwerem)

Negative => Coś, czego się nie spodziewałem, poszło nie tak (błąd systemu - nieoczekiwany wyjątek - zewnętrzne wymuszone zakończenie np kill -9 )

(wartości większe niż 128 są w rzeczywistości ujemne, jeśli uważasz je za 8-bitowe ze znakiem binarnym lub uzupełnieniem dwójkowym)

Tutaj jest mnóstwo dobrych standardowych kodów wyjścia

Robert
źródło
12
„Coś, czego się spodziewałem, że poszło nie tak, poszło nie tak” brzmi jak „Wszystko w porządku”.
tobe
„Rzeczy, których ja, jako programista, można się spodziewać w sposób przewidywalny” Błąd użytkownika a błąd systemu; Jest to w rzeczywistości ujęte w górnym plakacie: wartości 128-255 są -ve wrt 8-bitowy podpisany binarny.
Robert
6
@tobe To naprawdę bardziej jak „Coś, czego się spodziewałem, że pójdzie nie tak, poszło nie tak”;)
Marcel Hernandez,
1
Bash traktuje kody wyjścia jako 8-bitowe niepodpisane, i moduje 256, więc -1 zmienia się na 255, a 256 staje się 0. Sygnały (np. W przypadku zabicia kill -15) często powodują kod wyjścia 128+signal, ale (oprócz 9) można obsługiwać zwraca inny kod wyjścia. Wartość „ -in” kill -15oznacza liczbę jako sygnał, a nie „pid”, nie czyni sygnału ujemnym.
Matthew
Kiedy to zrobisz, System.exit(-1)a następnie w powłoce pojawi echo $?się „255”. Dlatego powiedziałem, że liczby ujemne są błędami systemowymi, a nie z powodu „-” w parametrze kill. Naprawdę myślałeś, że tak właśnie myślałem? Ale dziękuję za wyjaśnienie mechanizmu, za pomocą którego Bash konstruuje te kody.
Robert
51

System.exit(system call)kończy aktualnie działającą maszynę wirtualną Java, inicjując sekwencję zamykania. Argument służy jako kod statusu .

Zgodnie z konwencją niezerowy kod stanu wskazuje na nieprawidłowe zakończenie.

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

Czytaj więcej na Java

W systemach Unix i Linux, 0dla pomyślnego wykonania i / 1lub wyższego dla wykonania nieudanego.

Premraj
źródło
3
Ta odpowiedź wydaje się być sprzeczna z odpowiedzią @
roberta
W dokumencie java nie wspomniano, że kod wyjścia -1 reprezentuje BŁĄD, a zamiast tego sformułowanie brzmi „status - status zakończenia. Zgodnie z konwencją niezerowy kod statusu wskazuje na nieprawidłowe zakończenie”.
Damith,
EXIT_*nie istnieje w Javie.
juanchito
6

exit(0)zwykle używany do wskazania pomyślnego zakończenia. exit(1)lub exit(-1)jakakolwiek inna niezerowa wartość wskazuje ogólnie na nieudane zakończenie.

Purushottam Sadh
źródło
Co mi się podoba, argument jest przekazywany przez program kodujący. Nie zwraca wartości przez metodę. Jak może wskazywać wynik zakończenia?
anKotliner
4

Oto odpowiedź.

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
Lova Chittumuri
źródło
2

Dobrym gotcha jest dowolny kod błędu> 255 zostanie przekonwertowany na kod błędu% 256. Należy zachować szczególną ostrożność, jeśli używają niestandardowego kodu błędu> 255 i oczekują dokładnego kodu błędu w logice aplikacji. http://www.tldp.org/LDP/abs/html/exitcodes.html

koczownik
źródło
1

różnica liczb wprowadzonych w system.exit () jest wyjaśniona w innych odpowiedziach. ale RZECZYWISTA RÓŻNICA polega na tym, że System.exit () jest kodem zwracanym do procesu wywoływania. Jeśli program jest wywoływany przez system operacyjny, wówczas kod powrotu poinformuje system operacyjny, że jeśli system.exit () zwrócił 0, wszystko było w porządku, ale jeśli nie coś poszło nie tak, mogą istnieć pewne procedury obsługi dla tego procesu nadrzędnego

parsa
źródło
0

Gdy inni odpowiadają, to 0znaczy sukces, w przeciwnym razie.

Jeśli użyjesz pliku nietoperza (okno) System.exit(x)zadziała.

Kod java (myapp):

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

}

plik nietoperza:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --
nguyên
źródło
-2

System.exit (0) zgodnie z konwencją niezerowy kod stanu wskazuje na nieprawidłowe zakończenie.

System.exit (1) - Oznacza to, że zakończenie nie powiodło się z powodu błędu

androminor
źródło
Argument ten zawsze „służy jako kod statusu”. Nie tylko wtedy, gdy wynosi zero.
Markiz Lorne
o tak . przepraszam mój zły 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); 
}

}

W powyższym kodzie, gdy jego System.exit (0); a kiedy naciskam przypadek 5, wychodzi ono poprawnie, ale kiedy używam System.exit (1); i naciśnij przypadek 5, to wychodzi z błędem i ponownie, gdy próbuję z przypadkiem 15, to wychodzi poprawnie przez to dowiedziałem się, że kiedykolwiek wstawiamy jakiś argument wewnętrzny do int, określa to, że bierze znak z tej pozycji, tj. jeśli wstawię (4) oznacza, że ​​pobiera piąty znak z tego ciągu, jeśli jego (3), oznacza zabiera czwarty znak z wprowadzonego ciągu

LEGENDA MORTAL
źródło