Perbedaan Sistem. keluar (0), System.exit (-1), System.exit (1) di Jawa

280

Saya ingin tahu perbedaan antara yang berikut di Jawa

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

Kapan saya harus menggunakan kode di atas dengan tepat?

giri
sumber
17
mengapa Anda tidak menandai jawaban sebagai 'jawaban terbaik' sehingga ada tanda centang hijau? ini membantu orang lain mengetahui apa yang terbaik !!
Saksham Goyal

Jawaban:

253

Parameter keluar harus memenuhi syarat jika eksekusi program berjalan baik atau buruk. Ini adalah semacam faktor keturunan dari bahasa pemrograman yang lebih tua di mana berguna untuk mengetahui apakah ada kesalahan dan apa yang salah.

Kode keluar adalah

  • 0 ketika eksekusi berjalan dengan baik;
  • 1, -1, whatever != 0Ketika beberapa kesalahan, Anda dapat menggunakan nilai yang berbeda untuk berbagai jenis kesalahan.

Jika saya benar kode keluar dulu hanya angka positif (maksud saya di UNIX) dan menurut kisaran:

  • 1-127adalah kode yang ditentukan pengguna (dihasilkan oleh panggilan exit(n))
  • 128-255adalah kode yang dihasilkan oleh terminasi karena sinyal unix yang berbeda seperti SIGSEGV atau SIGTERM

Tapi saya tidak berpikir Anda harus peduli saat coding di Java, itu hanya sedikit informasi. Ini berguna jika Anda berencana untuk membuat program Anda berinteraksi dengan alat standar.

Mendongkrak
sumber
31
Perhatikan juga bahwa kode keluar dari 0 dianggap benar di shell dan kode lainnya dianggap salah. Jadi java MyApp && echo successakan mencetak "berhasil" jika MyApp memiliki kode keluar 0, yaitu jika panggilan exit(0)atau hanya mencapai akhir metode utama tanpa kesalahan.
sepp2k
16
Harap, selalu perhatikan kode keluar jika aplikasi Anda dapat digunakan dalam skrip. Sangat menjengkelkan memiliki alat yang gagal diam-diam di tengah skrip Anda (atau mencetak beberapa jejak tumpukan dan keluar dengan 0).
Doncho Gunchev
6
Satu hal yang perlu diperhatikan: ketika mengembalikan -1, angka positif terbesar yang mungkin dikembalikan dalam konteks yang tidak ditandatangani (dalam representasi komplemen dua -1 selalu mengatur semua bit terlepas dari jumlah byte dalam angka). Jadi -1 biasanya dikembalikan ketika Anda mengembalikan kesalahan tidak spesifik dan tidak ingin berbenturan dengan kemungkinan kode kesalahan yang sudah ditentukan dan didokumentasikan. misalnya kode kesalahan 1 mungkin telah didokumentasikan sebagai kesalahan tulis; kode kesalahan 2 mungkin kesalahan baca, dll.
Nylon Smile
Ini semacam 'keturunan' dari pintu keluar * Unix (2) `sebenarnya.
Marquis of Lorne
127

Zero => Semuanya Oke

Positive => Sesuatu yang saya harapkan berpotensi salah beres (baris perintah buruk, tidak dapat menemukan file, tidak dapat terhubung ke server)

Negative=> Sesuatu yang saya tidak harapkan sama sekali salah (kesalahan sistem - pengecualian yang tidak terduga - misalnya pemutusan paksa secara eksternal kill -9)

(nilai yang lebih besar dari 128 sebenarnya negatif, jika Anda menganggapnya sebagai biner bertanda 8-bit, atau pelengkap berpasangan)

Ada banyak kode keluar standar yang baik di sini

robert
sumber
12
"Sesuatu yang saya harapkan salah beres" terdengar seperti "Semuanya Oke".
tobe
"Hal-hal yang saya sebagai pengembang dapat diharapkan untuk mengantisipasi" Kesalahan Pengguna vs Kesalahan Sistem; Ini sebenarnya ditutupi oleh poster atas: nilai 128-255 adalah -ve wrt 8-bit binary.
robert
6
@tobe Ini benar-benar lebih seperti "Sesuatu yang saya harapkan bisa salah, benar-benar salah";)
Marcel Hernandez
1
Bash memperlakukan kode keluar sebagai 8-bit yang tidak ditandatangani, dan akan mod 256, sehingga -1 menjadi 255 dan 256 menjadi 0. Sinyal (dalam sebuah kill, misalnya kill -15) sering menghasilkan kode keluar 128+signal, tetapi (selain dari 9) dapat ditangani dan mengembalikan kode keluar yang berbeda. The -dalam kill -15adalah tanda nomor sebagai sinyal dan tidak pid, itu tidak membuat sinyal negatif.
Matius
Ketika Anda melakukannya System.exit(-1)dan kemudian di shell echo $?Anda, Anda mendapatkan '255'. Inilah sebabnya saya mengatakan angka negatif adalah kesalahan sistem, bukan karena '-' pada parameter kill. Apakah Anda serius berpikir itu yang saya pikirkan? Tetapi terima kasih telah menjelaskan mekanisme yang digunakan Bash untuk menyusun kode-kode ini.
robert
51

System.exit(system call)mengakhiri mesin virtual Java yang sedang berjalan dengan memulai urutan penonaktifannya. Argumen berfungsi sebagai kode status .

Dengan konvensi, kode status bukan nol menunjukkan penghentian abnormal.

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

Baca Lebih Lanjut di Jawa

Pada sistem Unix dan Linux, 0untuk eksekusi yang sukses dan 1atau lebih tinggi untuk eksekusi yang gagal.

Premraj
sumber
3
Jawaban ini tampaknya bertentangan dengan jawaban @ robert
amdev
Itu belum disebutkan dalam dokumen java bahwa kode keluar -1 mewakili ERROR sebagai gantinya kata-katanya adalah "status - Status pemutusan. Dengan konvensi, kode status bukan nol menunjukkan penghentian abnormal."
Damith
EXIT_*tidak ada di Jawa.
juanchito
6

exit(0)umumnya digunakan untuk menunjukkan pemutusan hubungan kerja yang sukses. exit(1)atau exit(-1)atau nilai non-nol lainnya menunjukkan penghentian tidak berhasil secara umum.

Purushottam Sadh
sumber
Apa alasan saya adalah argumen dilewatkan oleh coder. Tidak mengembalikan nilai dengan metode. Bagaimana bisa menunjukkan hasil penghentian?
anKotliner
4

Inilah jawabannya.

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

Gotcha yang baik adalah kode kesalahan apa pun> 255 akan dikonversi menjadi kode kesalahan% 256. Orang harus berhati-hati tentang hal ini jika mereka menggunakan kode kesalahan khusus> 255 dan mengharapkan kode kesalahan yang tepat dalam logika aplikasi. http://www.tldp.org/LDP/abs/html/exitcodes.html

pengembara
sumber
1

perbedaan angka yang dimasukkan ke system.exit () dijelaskan dalam jawaban lain. tetapi PERBEDAAN NYATA adalah System.exit () adalah kode yang akan dikembalikan ke proses pemanggilan. Jika program dijalankan oleh sistem Operasi maka kode pengembalian akan memberi tahu OS bahwa jika system.exit () mengembalikan 0 daripada semuanya baik-baik saja tetapi jika tidak ada yang salah, maka mungkin ada beberapa penangan untuk itu dalam proses induk

parsa
sumber
0

Ketika orang lain menjawab 0artinya sukses, sebaliknya.

Jika Anda menggunakan file bat (jendela) System.exit(x)akan berpengaruh.

Kode java (myapp):

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

}

file bat:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --
nguyên
sumber
-2

System.exit (0) oleh konvensi, kode status bukan nol menunjukkan penghentian abnormal.

System.exit (1) -Ini berarti pemutusan tidak berhasil karena beberapa kesalahan

androminor
sumber
Argumen selalu 'berfungsi sebagai kode status'. Bukan hanya ketika itu nol.
Marquis of Lorne
Oh ya . maaf EJP saya yang buruk
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); 
}

}

Dalam kode di atas ketika System.exit (0); dan ketika saya menekan case 5 keluar dengan benar tetapi ketika saya menggunakan System.exit (1); dan tekan case 5 keluar dengan kesalahan dan sekali lagi ketika saya mencoba dengan case 15 ia keluar dengan benar ini saya mengetahui bahwa, kapan pun kita memasukkan argumen int dalam yang menentukan, dibutuhkan karakter dari posisi itu yaitu jika saya meletakkan (4) itu berarti mengambil karakter ke-5 dari string itu jika (3) maka itu berarti mengambil karakter ke-4 dari string yang dimasukkan

LEGENDA MORTAL
sumber