Saya punya masalah teoritis kecil dengan konstruksi try-catch.
Saya mengikuti ujian praktis kemarin tentang Jawa dan saya tidak mengerti contoh berikut:
try {
try {
System.out.print("A");
throw new Exception("1");
} catch (Exception e) {
System.out.print("B");
throw new Exception("2");
} finally {
System.out.print("C");
throw new Exception("3");
}
} catch (Exception e) {
System.out.print(e.getMessage());
}
Pertanyaannya adalah "seperti apa hasilnya nanti?"
Saya cukup yakin itu akan menjadi AB2C3, TAPI mengejutkan, itu tidak benar.
Jawaban yang tepat adalah ABC3 (diuji dan benar-benar seperti itu).
Pertanyaan saya adalah, kemana perginya Exception ("2")?
print(e.getMessage())
:). Anda mengira hasilnya adalahAB2C3
: apakah Anda pikircatch
blok terluar akan dieksekusi dua kali?Jawaban:
Dari Spesifikasi Bahasa Jawa 14.20.2. :
Jadi, ketika ada blok penangkap yang melempar pengecualian:
tetapi ada juga blok akhirnya yang juga melempar pengecualian:
Exception("2")
akan dibuang dan hanyaException("3")
akan diperbanyak.sumber
return
pernyataan. Jika blok Anda akhirnya memiliki pengembalian, itu akan menimpa pengembalian apa pun di bloktry
ataucatch
. Karena "fitur" ini, praktik yang baik adalah bahwa pada akhirnya blok tidak boleh membuang pengecualian atau memiliki pernyataan pengembalian.Pengecualian yang dimasukkan akhirnya memblokir menekan pengecualian yang dilemparkan sebelumnya dalam mencoba atau menangkap blok.
Java 7 contoh: http://ideone.com/0YdeZo
Dari contoh Javadoc :
try-with
Sintaks baru Java 7 menambahkan langkah lain dari penindasan pengecualian: Pengecualian yang dilemparkan dalam blok coba menekan yang dilempar sebelumnya di bagian try-with.dari contoh yang sama:
Dalam kode dari pertanyaan, setiap blok dengan jelas membuang pengecualian lama, bahkan tidak mencatatnya, tidak baik ketika Anda mencoba menyelesaikan beberapa bug:
http://en.wikipedia.org/wiki/Error_hiding
sumber
Karena
throw new Exception("2");
terlempar daricatch
blok dan tidaktry
, itu tidak akan ditangkap lagi.Lihat 14.20.2. Eksekusi try-akhirnya dan try-catch-akhirnya .
Inilah yang terjadi:
sumber
Pertanyaan Anda sangat jelas, dan jawabannya sederhana pada tingkat yang sama .. Objek Pengecualian dengan pesan "2" ditimpa oleh objek Pengecualian dengan pesan sebagai "3".
Penjelasan: Ketika Exception terjadi, objeknya dilemparkan untuk menangkap blok yang harus ditangani. Tetapi ketika pengecualian terjadi di catch block itu sendiri, objeknya ditransfer ke OUTER CATCH Block (jika ada) untuk Penanganan pengecualian. Dan hal yang sama terjadi di sini. Objek Pengecualian dengan pesan "2" ditransfer ke blok tangkapan OUTER. Tapi tunggu .. Sebelum meninggalkan blok try-catch bagian dalam, HARUS DIEKSEKUSI. Di sini terjadi perubahan yang kami khawatirkan. Objek PENGECUALIAN baru (dengan pesan "3") dibuang atau blok terakhir ini yang menggantikan objek Pengecualian yang sudah dibuang (dengan pesan "2"). Akibatnya, ketika pesan objek Pengecualian dicetak, kami mendapat nilai yang diganti yaitu "3" dan bukan "2".
Keep Remember: Hanya satu objek pengecualian yang dapat ditangani oleh pada blok CATCH.
sumber
The
finally
blok selalu berjalan. Baik Andareturn
dari dalam blok coba atau pengecualian dilemparkan. Pengecualian yang dilemparkan difinally
blok akan menimpa yang dilemparkan di cabang tangkapan.Selain itu, melempar pengecualian tidak akan menyebabkan output apa pun dengan sendirinya. Baris
throw new Exception("2");
tidak akan menulis apa pun.sumber
Menurut kode Anda:
Seperti yang Anda lihat di sini:
# 1
;B - # 2
;# 3
dieksekusi setelah try-catch (atau hanya mencoba, jika tidak terjadi pengecualian) pernyataan dan cetakanC - # 4
dan melemparkan pengecualian baru;# 5
;Hasilnya adalah
ABC3
. Dan2
dihilangkan dengan cara yang sama seperti1
sumber