Mengapa Java keluar dengan sukses setelah pengecualian yang tidak tertangkap?

24

Setiap kali program Perl, Python, C ++ atau Tcl berhenti dengan pengecualian yang tidak tertangani, runtimes bahasa tersebut berhati-hati untuk mendaftarkan kode keluar yang tidak nol untuk proses tersebut. Bahkan program berbasis Eclipse mengembalikan 1 jika gagal saat startup. Program yang dijalankan oleh standar java.exe, bagaimanapun, dengan senang hati mengembalikan nol tidak peduli seberapa cepat mereka berakhir, kecuali program memanggil System.exit()dengan nilai keluar. Bahkan AssertionFailedErroratau UnsatisfiedLinkErrordilaporkan kembali ke program panggilan saat keluar dengan sukses.

Tentu saja tidak semua sistem memiliki kode pengembalian program, tetapi Unix dan Windows cukup penting untuk menjamin java.lang.Process.exitValue()proses anak; bukankah mereka juga menjamin konvensi penghormatan untuk proses induk?

Apakah ini cacat dalam desain bahasa atau hanya dalam implementasi? Apakah ada argumen bahwa itu ide yang bagus?

James
sumber
Bertanya-tanya apakah ini tidak lebih cocok di StackOverflow ... Tapi hanya pendapat saja.
gablin
@ gablin Mmm, memang saya mulai menulis pertanyaan ini pada SO kemudian berubah pikiran dan mempostingnya di sini.
James
4
The javaperintah dalam Java 6 dan Java 7 kedua tampaknya merespon dengan kode keluar non-nol jika eksepsi tidak tertangkap dinaikkan.
dimo414

Jawaban:

28

Jika Spesifikasi Bahasa Jawa tidak secara eksplisit menentukan nilai keluar apa yang diharapkan, maka itu tidak terdefinisi dan Anda tidak harus bergantung padanya.

Anda perlu menangkap Throwable dalam metode utama Anda, dan panggil System.exit (1) sendiri.


sumber
8
Jadi bukankah itu kekurangan untuk membiarkannya tidak terdefinisi?
James
3
Mungkin tidak. Satu-satunya hal yang penting adalah apa yang dikatakan JLS.