Rumah >Java >javaTutorial >Mengapakah coretan kod menghasilkan output \'132Exception dalam utas utama MyExc1\' walaupun fakta bahawa pengecualian MyExc2 dilemparkan ke dalam blok tangkapan?
Pengendalian Pengecualian dalam Tangkapan dan Akhirnya Dihalang
Dalam tugasan Java universiti baru-baru ini, seorang pelajar menemui coretan kod berikut dan diminta untuk meramalkan outputnya:
<code class="java">class MyExc1 extends Exception {} class MyExc2 extends Exception {} class MyExc3 extends MyExc2 {} public class C1 { public static void main(String[] args) throws Exception { try { System.out.print(1); q(); } catch (Exception i) { throw new MyExc2(); } finally { System.out.print(2); throw new MyExc1(); } } static void q() throws Exception { try { throw new MyExc1(); } catch (Exception y) { } finally { System.out.print(3); throw new Exception(); } } }</code>
Apabila pelajar menjawab dengan "13Exception dalam utas utama MyExc2," mereka terkejut apabila mengetahui bahawa jawapan yang betul ialah "132Exception dalam thread utama MyExc1."
Memahami Penyebaran Pengecualian dalam Tangkapan dan Akhirnya Blok
Untuk memahami output yang betul, adalah penting untuk memahami gelagat pengecualian dalam tangkapan dan akhirnya menyekat. Mengikut mekanisme pengendalian pengecualian Java:
Dalam blok tangkapan, pengecualian baharu, MyExc2, tercampak. Ini membatalkan pengecualian asal, MyExc1.
Pengecualian MyExc2 disebarkan keluar dari blok tangkapan dan ke dalam blok akhirnya.Blok akhirnya mencetak "2." Walau bagaimanapun, sebelum keluar daripada kaedah q, blok akhirnya melemparkan pengecualian baharu, yang mula membuka lilitan tindanan.Oleh itu, output yang betul ialah "132Exception dalam utas utama MyExc1."
Atas ialah kandungan terperinci Mengapakah coretan kod menghasilkan output \'132Exception dalam utas utama MyExc1\' walaupun fakta bahawa pengecualian MyExc2 dilemparkan ke dalam blok tangkapan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!