Sistem Farkı. Java'da System.exit (-1), System.exit (1) çıkış (0)


280

Java ile aşağıdakiler arasındaki farkı bilmek istiyorum

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

Yukarıdaki kodu ne zaman uygun şekilde kullanmalıyım?


17
Neden cevabı 'en iyi cevap' olarak işaretlemediniz ki yeşil bir onay işareti olsun? diğer insanların en iyi ne olduğunu bilmek yardımcı olur !!
Saksham Goyal

Yanıtlar:


252

Programın yürütülmesi iyi veya kötü gittiğinde çıkış parametresi uygun olmalıdır. Bir şeylerin yanlış gittiğini ve neyin yanlış gittiğini bilmek yararlı olduğu eski programlama dillerinden bir çeşit kalıtım.

Çıkış kodu:

  • 0 infaz iyi gittiğinde;
  • 1, -1, whatever != 0Bazı hata oluştuğu sırada, hataların farklı tür için farklı değerler kullanabilirsiniz.

Ben çıkış kodları sadece pozitif sayılar (UNIX demek istediğim) ve aralığa göre doğru ise:

  • 1-127kullanıcı tanımlı kodlardır (çağrılarak oluşturulur exit(n))
  • 128-255SIGSEGV veya SIGTERM gibi farklı unix sinyalleri nedeniyle sonlandırma ile oluşturulan kodlardır

Ama Java üzerinde kodlama yaparken önemsemeniz gerektiğini düşünmüyorum, bu sadece biraz bilgi. Programlarınızı standart araçlarla etkileşime sokmayı planlıyorsanız faydalıdır.


31
Ayrıca 0 çıkış kodunun kabukta true, diğer kodların false olarak sayıldığını unutmayın. Yani java MyApp && echo successo ararsa BenimUygulamam 0 çıkış kodu, yani sahip IFF "başarı" yazdırır exit(0)veya sadece hatasız ana yöntemin sonundan ulaşır.
sepp2k

16
Uygulamanız bir komut dosyasında kullanılabiliyorsa, lütfen her zaman çıkış koduna dikkat edin. Komut dosyanızın ortasında sessizce başarısız olan bir araca sahip olmak çok can sıkıcı (veya yığın izini yazdırıp 0 ile çıkılıyor).
Doncho Gunchev

6
Dikkat edilmesi gereken bir nokta: -1 döndürülürken, mümkün olan en büyük pozitif sayı imzasız bağlamda döndürülür (ikinin tamamlayıcı gösteriminde -1, sayıdaki bayt sayısına bakılmaksızın her zaman tüm bitleri ayarlar). Bu nedenle -1, genellikle spesifik olmayan bir hata döndürdüğünüzde ve daha önce tanımlanmış ve belgelenmiş olası hata kodlarıyla çakışmasını istemediğinizde döndürülür. örneğin, hata kodu 1 yazma hatası olarak belgelenmiş olabilir; hata kodu 2 hata, vb. okunabilir
Nylon Smile

Aslında Unix'in * çıkışından (2) `` bir tür kalıtım ''.
Lorne Marquis

127

Zero => Herşey yolunda

Positive => Beklediğim bir şey potansiyel olarak yanlış gidebilir (yanlış komut satırı, dosya bulamıyor, sunucuya bağlanamadı)

Negative=> Hiç beklemediğim bir şey yanlış gitti (sistem hatası - beklenmedik istisna - harici zorla sonlandırma kill -9)

(bunları 8 bit imzalı ikili veya ikiye tamamlayıcı olarak görürseniz 128'den büyük değerler gerçekten negatiftir)

Burada bir sürü iyi standart çıkış kodu var


12
"Yanlış gitmeyi umduğum bir şey yanlış gitti" kulağa "Herşey yolunda" gibi geliyor.
tobe

"Geliştirici olarak benim düşündüğüm şeyler beklenebilir" Kullanıcı Hatası vs Sistem Hatası; Bu aslında üst poster tarafından kapsanır: 128-255 değerleri -ve wrt 8-bit imzalı ikili.
robert

6
Daha "beklenen bir şey benim gibi gerçekten @tobe olabilir yanlış aslında yanlış gitti go";)
Marcel Hernandez

1
Bash çıkış kodlarına 8 bit imzasız olarak davranır ve 256 modunu kullanır, böylece -1 255 ve 256 0 olur. Sinyaller (örneğin, bir öldürmede kill -15) çıkış koduyla sonuçlanır 128+signal, ancak (9'dan başka) işlenebilir ve farklı bir çıkış kodu döndürür. -İçinde kill -15işaretleri bir sinyal ve bir pid olarak sayı, bu sinyal negatif yapmaz olduğunu.
Matthew

Yaptığınızda System.exit(-1)ve sonra kabuğunuzda echo $?'255' alırsınız. Bu yüzden negatif sayıların kill parametresindeki '-' yüzünden değil sistem hataları olduğunu söyledim. Düşündüğüm şeyin cidden olduğunu düşündün mü? Ancak Bash'in bu kodları oluşturma mekanizmasını açıkladığınız için teşekkür ederiz.
Robert

51

System.exit(system call)şu anda çalışan Java sanal makinesini kapatma sırasını başlatarak sonlandırır. Argüman bir durum kodu görevi görür .

Kural olarak, sıfır olmayan bir durum kodu anormal sonlandırmayı gösterir.

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

Java'da Daha Fazla Bilgi

Unix ve Linux sistemlerinde, 0başarılı yürütmeler için ve 1daha yüksek başarısız yürütmeler için.


3
Bu cevap @
robert'in

Java belgesinde, çıkış kodu -1'in ERROR'u temsil ettiğini, bunun yerine "durum - Sonlandırma durumu" ifadesini kullandığına değinmedik.
Damith

EXIT_*Java'da mevcut değil.
juanchito


6

exit(0)genellikle başarılı fesih belirtmek için kullanılır. exit(1)veya exit(-1)sıfır dışında herhangi bir değer, genel olarak başarısız sonlandırmayı gösterir.


Hangi argüman bana kodlayıcı tarafından geçirilir.Yöntemle bir dönüş değeri değil. Sonlandırma sonucunu nasıl gösterebilir?
anKotliner

4

İşte cevap.

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 () öğesine konan sayıların farkı diğer cevaplarda açıklanmıştır. ancak GERÇEK FARK, System.exit () işlevinin çağırma işlemine döndürülen bir kod olmasıdır. Program İşletim sistemi tarafından çağrılıyorsa, dönüş kodu işletim sistemine sistem.exit () her şeyden 0 döndürürse bir şey yolunda gitmezse, bir şey ters gitmediğinde, ana işlemde bunun için bazı işleyiciler olabileceğini söyler.


0

Diğerleri 0anlam başarısına cevap verir gibi , aksi takdirde.

Yarasa dosyası (pencere) kullanırsanız System.exit(x)etkili olur.

Java kodu (myapp):

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

}

yarasa dosyası:

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

-2

Sistem.exit (0) kural olarak, sıfır olmayan bir durum kodu anormal sonlandırmayı gösterir.

System.exit (1) -Bazı hata nedeniyle sonlandırmanın başarısız olduğu anlamına gelir


Argüman daima 'durum kodu olarak işlev görür'. Sadece sıfır olduğunda değil.
Lorne Marquis

Oh evet . üzgünüm benim kötü 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); 
}

}

Yukarıdaki kodda System.exit (0); ve kasa 5'e bastığımda düzgün çıkıyor ancak System.exit (1) kullandığımda; ve basın dava 5 hata ile çıkar ve tekrar dava 15 ile denediğimde bu düzgün çıkar, ben herhangi bir int içine argüman koymak zaman bunu belirtir, o pozisyondan karakteri almak olduğunu biliyorum yani koymak (4) bu karakter dizisinin 5. karakterini almak anlamına gelirse (3)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.