Saya meninjau beberapa kode baru. Program ini memiliki percobaan dan akhirnya hanya memblokir. Karena blok tangkap dikecualikan, bagaimana cara kerja blok coba jika menemukan pengecualian atau apa pun yang dapat dibuang? Apakah itu langsung menuju ke blok terakhir?
java
try-catch
finally
try-catch-finally
try-finally
NullPointer0x00
sumber
sumber
Jawaban:
Jika salah satu kode dalam blok percobaan dapat memunculkan pengecualian yang dicentang, kode itu harus muncul di klausa lemparan dari tanda tangan metode. Jika pengecualian yang tidak dicentang dilemparkan, itu menggelembung keluar dari metode.
Blok terakhir selalu dijalankan, baik pengecualian dilempar atau tidak.
sumber
Catatan kecil di
try
/finally
: Akhirnya akan selalu dijalankan kecualiSystem.exit()
disebut.try{}
blok tidak pernah berakhir (misalnya tak berujung loop).sumber
try{..} catch{ throw ..} finally{..}
? Saya pikir akhirnya tidak akan dieksekusiSpesifikasi Bahasa Java (1) menjelaskan bagaimana
try-catch-finally
dijalankan. Tidak memiliki tangkapan sama dengan tidak memiliki tangkapan yang mampu menangkap Throwable yang diberikan.(1) Eksekusi coba-tangkap-akhirnya
sumber
Bagian dalam akhirnya dieksekusi sebelum melempar pengecualian ke blok luar.
Hasil dalam
sumber
Blok terakhir selalu dijalankan setelah blok percobaan berakhir, apakah percobaan berakhir secara normal atau tidak normal karena pengecualian, er, dapat dibuang.
Jika pengecualian dilempar oleh salah satu kode dalam blok percobaan, maka metode saat ini hanya melempar kembali (atau terus melempar) pengecualian yang sama (setelah menjalankan blok akhirnya).
Jika blok terakhir melempar pengecualian / kesalahan / dapat dibuang, dan sudah ada lemparan tertunda, itu menjadi jelek. Sejujurnya, saya lupa persis apa yang terjadi (begitu banyak untuk sertifikasi saya bertahun-tahun yang lalu). Saya pikir kedua lemparan terhubung bersama, tetapi ada beberapa voodoo khusus yang harus Anda lakukan (yaitu - panggilan metode yang harus saya cari) untuk mendapatkan masalah asli sebelum "akhirnya" muntah, er, muntah.
Kebetulan, coba / akhirnya adalah hal yang cukup umum untuk dilakukan untuk manajemen sumber daya, karena java tidak memiliki destruktor.
Mis -
"Akhirnya", satu tip lagi: jika Anda repot - repot memasukkan tangkapan, baik menangkap subkelas throwable spesifik (yang diharapkan), atau cukup menangkap "Throwable", bukan "Exception", untuk perangkap kesalahan umum semua. Terlalu banyak masalah, seperti kesalahan refleksi, melempar "Kesalahan", bukan "Pengecualian", dan masalah itu akan hilang dengan benar oleh "tangkap semua" yang dikodekan sebagai:
lakukan ini sebagai gantinya:
sumber
Versi Java sebelum versi 7 memungkinkan tiga kombinasi coba-tangkap-akhirnya ...
finally
blok akan selalu dieksekusi apa pun yang terjadi ditry
atau / dancatch
blokir. jadi jika tidak adacatch
blokir, pengecualian tidak akan ditangani di sini.Namun, Anda masih memerlukan penangan pengecualian di suatu tempat dalam kode Anda - kecuali jika Anda ingin aplikasi Anda benar-benar mogok. Itu tergantung pada arsitektur aplikasi Anda persis di mana handler itu berada.
sumber
Pengecualian dilempar keluar dari blok, seperti dalam kasus lain di mana tidak tertangkap.
Blok terakhir dijalankan terlepas dari bagaimana blok percobaan keluar - terlepas dari apakah ada tangkapan sama sekali, terlepas dari apakah ada tangkapan yang cocok.
Blok tangkapan dan yang terakhir adalah bagian ortogonal dari blok uji coba. Anda dapat memiliki salah satu atau keduanya. Dengan Java 7, Anda tidak dapat memiliki keduanya!
sumber
Apakah Anda tidak mencobanya dengan program itu? Itu akhirnya akan memblokir dan mengeksekusi blok terakhir, tetapi, pengecualian tidak akan ditangani. Tapi, pengecualian itu bisa dibatalkan di blok terakhir!
sumber
Blok terakhir dijalankan setelah blok percobaan selesai. Jika sesuatu dilempar ke dalam blok percobaan ketika meninggalkan blok akhirnya dijalankan.
sumber
Di dalam
try
blok kami menulis kode yang dapat memunculkan pengecualian. Thecatch
blok di mana kami menangani pengecualian. Thefinally
block selalu dieksekusi tidak peduli apakah pengecualian terjadi atau tidak.Sekarang jika kita memiliki blok coba-akhirnya daripada blok coba-tangkap-akhirnya maka pengecualian tidak akan ditangani dan setelah blok coba alih-alih kontrol akan menangkap blok itu akan pergi ke blok akhirnya. Kita dapat menggunakan blok coba-akhirnya ketika kita tidak ingin melakukan apa pun dengan pengecualian.
sumber
Terlepas dari pengecualian dilempar atau tidak di
try
blok -finally
blokir akan dieksekusi. Pengecualian tidak akan tertangkap.sumber