System.exit()
dapat digunakan untuk menjalankan kait shutdown sebelum program berhenti. Ini adalah cara yang mudah untuk menangani shutdown dalam program yang lebih besar, di mana semua bagian dari program tidak dapat (dan tidak seharusnya) saling memperhatikan. Kemudian, jika seseorang ingin berhenti, dia bisa langsung meneleponSystem.exit()
, dan kait penghenti (jika diatur dengan benar) mengurus semua upacara penutupan yang diperlukan seperti menutup file, melepaskan sumber daya dll.
"Metode ini tidak pernah kembali secara normal." hanya berarti bahwa metode tersebut tidak akan kembali; sekali utas masuk ke sana, tidak akan kembali.
Cara lain, mungkin lebih umum, untuk keluar dari suatu program adalah dengan hanya mencapai akhir main
metode. Tetapi jika ada utas non-daemon berjalan, mereka tidak akan dimatikan dan dengan demikian JVM tidak akan keluar. Jadi, jika Anda memiliki utas non-daemon semacam itu, Anda memerlukan cara lain (selain kait penonaktifan) untuk mematikan semua utas non-daemon dan melepaskan sumber daya lainnya. Jika tidak ada utas non-daemon lainnya, kembali darimain
akan mematikan JVM dan akan memanggil kait penonaktifan.
Untuk beberapa alasan kait penghentian tampaknya merupakan mekanisme yang undervalued dan disalahpahami, dan orang-orang menciptakan kembali roda dengan semua jenis peretasan khusus untuk menghentikan program mereka. Saya akan mendorong menggunakan kait shutdown; itu semua ada di Runtime standar yang akan Anda gunakan.
Runtime.getRuntime().halt()
)Dalam hal ini, itu tidak diperlukan. Tidak ada utas tambahan yang telah dimulai, Anda tidak mengubah kode keluar (yang standarnya 0) - pada dasarnya tidak ada gunanya.
Ketika dokumen mengatakan metode tidak pernah kembali secara normal, itu berarti baris kode berikutnya secara efektif tidak dapat dijangkau, meskipun kompiler tidak tahu bahwa:
Entah pengecualian akan dilemparkan, atau VM akan berakhir sebelum kembali. Itu tidak akan pernah "hanya kembali".
Sangat jarang
System.exit()
dipanggil IME. Masuk akal jika Anda menulis alat baris perintah, dan Anda ingin menunjukkan kesalahan melalui kode keluar daripada hanya melemparkan pengecualian ... tapi saya tidak ingat kapan terakhir kali saya menggunakannya dalam kode produksi normal .sumber
System.exit()
tidak akan pernah selesai secara normal - itu akan selalu lengkap dengan pengecualian, atau dengan VM dimatikan (yang tidak benar-benar tercakup dalam JLS).Metode tidak pernah kembali karena ini adalah akhir dunia dan tidak ada kode Anda yang akan dieksekusi selanjutnya.
Aplikasi Anda, dalam contoh Anda, akan tetap keluar di tempat yang sama dalam kode, tetapi, jika Anda menggunakan System.exit. Anda memiliki opsi untuk mengembalikan kode khusus ke lingkungan, seperti, katakanlah
Siapa yang akan menggunakan kode keluar Anda? Sebuah skrip yang disebut aplikasi. Bekerja di Windows, Unix dan semua lingkungan skrip lainnya.
Mengapa mengembalikan kode? Untuk mengatakan hal-hal seperti "Saya tidak berhasil", "Basis data tidak menjawab".
Untuk melihat cara mendapatkan nilai dari kode keluar dan menggunakannya dalam skrip unix shell atau skrip windows cmd, Anda dapat memeriksa jawaban ini di situs ini
sumber
System.exit(0)
mengakhiri JVM. Dalam contoh sederhana seperti ini sulit untuk mempersepsikan perbedaannya. Parameter dilewatkan kembali ke OS dan biasanya digunakan untuk menunjukkan penghentian abnormal (misalnya beberapa jenis kesalahan fatal), jadi jika Anda memanggil java dari file batch atau skrip shell Anda akan bisa mendapatkan nilai ini dan mendapatkan ide apakah aplikasi itu berhasil.Ini akan membuat dampak yang cukup besar jika Anda memanggil
System.exit(0)
aplikasi yang digunakan ke server aplikasi (pikirkan sebelum Anda mencobanya).sumber
Dalam aplikasi yang mungkin memiliki kait shutdown yang kompleks, metode ini tidak boleh dipanggil dari utas yang tidak dikenal.
System.exit
tidak pernah keluar secara normal karena panggilan akan diblokir sampai JVM diakhiri. Seolah-olah kode apa pun yang berjalan yang steker listriknya dicabut sebelum bisa selesai. MemanggilSystem.exit
akan memulai kait penutupan program dan utas apa pun yang panggilanSystem.exit
akan diblokir sampai penghentian program. Ini memiliki implikasi bahwa jika hook shutdown pada gilirannya mengirimkan tugas ke utas dari manaSystem.exit
dipanggil, program akan menemui jalan buntu.Saya menangani ini dalam kode saya dengan yang berikut:
sumber
Meskipun jawabannya benar-benar membantu tetapi beberapa cara itu melewatkan beberapa detail tambahan. Saya harap di bawah ini akan membantu memahami proses shutdown di java, selain jawaban di atas:
PS: JVM dapat dimatikan dengan tertib atau tiba - tiba .
sumber
Orang TIDAK PERNAH harus menelepon
System.exit(0)
untuk alasan ini:Keluar dari program "secara normal" memberikan kode keluar yang sama ke sistem operasi karena
System.exit(0)
itu berlebihan.Jika program Anda tidak dapat berhenti "secara normal" Anda telah kehilangan kendali atas [desain] pengembangan Anda. Anda harus selalu memiliki kontrol penuh terhadap status sistem.
Ngomong-ngomong: Mengembalikan kode pengembalian lain dari 0 masuk akal jika Anda ingin menunjukkan penghentian program yang tidak normal.
sumber
Diperlukan System.exit
Dalam kasus Anda, ia melakukan hal yang persis sama dengan pengembalian-dari-main yang sederhana.
sumber
exit
ini adalah satu-satunya pilihan Anda di sana.exit
. Bukan satu-satunya pilihan, tetapi jelas opsi yang layak dipertimbangkan.Spesifikasi Bahasa Jawa mengatakan itu
Itu berarti bahwa Anda harus menggunakannya ketika Anda memiliki program besar (baik, jangan sampai lebih besar dari ini) dan ingin menyelesaikan eksekusi.
sumber
Jika Anda memiliki program lain yang berjalan di JVM dan Anda menggunakan System.exit, program kedua itu akan ditutup juga. Bayangkan misalnya Anda menjalankan pekerjaan java pada node cluster dan bahwa program java yang mengelola node cluster berjalan di JVM yang sama. Jika pekerjaan itu akan menggunakan System.exit itu tidak hanya akan berhenti dari pekerjaan tetapi juga "mematikan node lengkap". Anda tidak akan dapat mengirim pekerjaan lain ke cluster node itu karena program manajemen telah ditutup secara tidak sengaja.
Oleh karena itu, jangan gunakan System.exit jika Anda ingin dapat mengontrol program Anda dari program java lain dalam JVM yang sama.
Gunakan System.exit jika Anda ingin menutup JVM lengkap dengan sengaja dan jika Anda ingin memanfaatkan kemungkinan yang telah dijelaskan dalam jawaban lain (mis. Kait penutup: kait penutup Java , kaitkan nilai pengembalian nol untuk baris perintah panggilan: Cara mendapatkan status keluar dari program Java di file batch Windows ).
Juga lihat Pengecualian Runtime: System.exit (num) atau melempar RuntimeException dari main?
sumber