Ini mungkin tampak seperti pertanyaan pemrograman 101 dan saya pikir saya tahu jawabannya tetapi sekarang saya perlu memeriksa ulang. Dalam potongan kode di bawah ini, akankah pengecualian yang dilemparkan ke dalam blok tangkapan pertama kemudian ditangkap oleh blok tangkapan umum pengecualian di bawah ini?
try {
// Do something
} catch(IOException e) {
throw new ApplicationException("Problem connecting to server");
} catch(Exception e) {
// Will the ApplicationException be caught here?
}
Saya selalu berpikir jawabannya adalah tidak, tetapi sekarang saya memiliki beberapa perilaku aneh yang bisa disebabkan oleh ini. Jawabannya mungkin sama untuk sebagian besar bahasa, tetapi saya bekerja di Jawa.
Jawaban:
Tidak, karena yang baru
throw
tidak ada ditry
blok secara langsung.sumber
RuntimeException
dilempar daricatch
blok tidak akan ada kesalahan kompilasi.catch
klausa pengecualian orangtua terdaftar sebelumcatch
klausa pengecualian anak . Pemahaman saya adalah bahwa Java tidak mengizinkan ini, dan itu ditangkap pada waktu kompilasi.Tidak. Sangat mudah untuk diperiksa.
Harus mencetak:
Secara teknis itu bisa jadi bug penyusun, implementasi tergantung, perilaku tidak ditentukan, atau sesuatu. Namun, JLS sudah dipakukan dengan sangat baik dan kompilernya cukup bagus untuk hal yang sederhana ini (case sudut generik mungkin masalah yang berbeda).
Juga perhatikan, jika Anda bertukar sekitar dua blok tangkap, itu tidak akan dikompilasi. Tangkapan kedua akan benar-benar terjangkau.
Perhatikan bahwa akhirnya blok selalu berjalan bahkan jika blok tangkapan dieksekusi (selain dari kasus konyol, seperti loop tak terbatas, melampirkan melalui antarmuka alat dan membunuh utas, menulis ulang bytecode, dll.).
sumber
finally
, tentu saja, untuk meneleponSystem.exit
. :-Pfor(;;);
lebih pendek, terkandung dalam bahasa, tidak memperkenalkan banyak cara efek samping dan, bagi saya, lebih jelas.System.exit
lebih ramah dengan CPU! : -O Tapi ya, oke, jelas ini adalah kriteria subjektif. Juga, saya tidak tahu Anda menjadi pegolf kode. ;-)Spesifikasi Bahasa Jawa mengatakan di bagian 14.19.1:
Referensi: http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#24134
Dengan kata lain, tangkapan penutup pertama yang dapat menangani pengecualian berlaku, dan jika pengecualian dikeluarkan dari tangkapan itu, itu tidak dalam lingkup tangkapan lain untuk percobaan awal, sehingga mereka tidak akan mencoba untuk menanganinya.
Satu hal yang berhubungan dan membingungkan untuk diketahui adalah bahwa pada struktur try-[catch]-akhirnya, blok akhirnya dapat melempar pengecualian dan jika demikian, setiap pengecualian yang dilemparkan oleh try atau catch block hilang. Itu bisa membingungkan saat pertama kali Anda melihatnya.
sumber
try
-dengan-sumber daya. Kemudian, jikatry
DANfinally
keduanya melempar,finally
ditekan, tetapi juga TAMBAH untuk pengecualian daritry
. Jikacatch
melempar juga, Anda tidak beruntung, kecuali Anda menanganinya sendiri melalui 'addSuppressed' dan menambahkantry
pengecualian - maka Anda memiliki ketiganya.Jika Anda ingin melempar pengecualian dari blok tangkap, Anda harus memberi tahu metode / kelas / dll Anda. bahwa itu perlu membuang kata pengecualian. Seperti itu:
Dan sekarang kompiler Anda tidak akan meneriaki Anda :)
sumber
Tidak - Seperti kata Chris Jester-Young, itu akan dilemparkan ke try-catch berikutnya dalam hierarki.
sumber
Seperti yang dikatakan di atas ...
Saya akan menambahkan bahwa jika Anda mengalami kesulitan melihat apa yang terjadi, jika Anda tidak dapat mereproduksi masalah di debugger, Anda dapat menambahkan jejak sebelum melemparkan kembali pengecualian baru (dengan Sistem lama yang baik .out.println lebih buruk, dengan sistem log yang bagus seperti log4j sebaliknya).
sumber
Itu tidak akan ditangkap oleh blok tangkapan kedua. Setiap Pengecualian hanya tertangkap saat berada di dalam blok percobaan. Anda dapat mencoba sarang (bukan itu ide yang bagus secara umum):
sumber
Tidak, karena semua tangkapan mengacu pada blok uji coba yang sama, jadi melempar dari dalam blok tangkap akan ditangkap oleh blok uji coba yang terlampir (mungkin dalam metode yang disebut ini)
sumber
Posting lama tetapi variabel "e" harus unik:
sumber