Penyebaran Pengecualian dalam Tangkapan dan Akhirnya Sekat
Dalam program Java, apabila pengecualian berlaku, ia merambat melalui timbunan sehingga ia dikendalikan oleh blok tangkapan yang sesuai atau menamatkan program. Walau bagaimanapun, pengecualian juga boleh dilemparkan dalam tangkapan atau akhirnya sekatan, menimbulkan persoalan tentang tingkah laku penyebarannya.
Pertimbangkan coretan kod berikut:
<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(); // Exception thrown in catch block } finally { System.out.print(2); throw new MyExc1(); // Exception thrown in finally block } } static void q() throws Exception { try { throw new MyExc1(); } catch (Exception y) { } finally { System.out.print(3); throw new Exception(); // Exception thrown in finally block } } }</code>
Apabila pengecualian dilemparkan dalam tangkapan atau akhirnya sekat, prinsip berikut terpakai:
Pengecualian Overriding: Jika pengecualian baharu dilemparkan dalam tangkapan atau akhirnya blok yang bertujuan untuk merambat keluar dari blok itu, pengecualian semasa sedang dijalankan akan dibatalkan, dan pengecualian baharu akan disebarkan ke luar, mengambil tempatnya. Pengecualian yang dibatalkan akan dibuang.
Dalam kod yang disediakan, senario pengecualian dalam kedua-dua blok tangkapan dan akhirnya menunjukkan prinsip ini:
Oleh itu, apabila pelaksanaan program mencapai kaedah utama selepas membuka lilitan tindanan, pengecualian MyExc2 mempunyai telah ditindih oleh MyExc1, yang kemudiannya dicetak dan dikendalikan. Oleh itu, output yang betul ialah "132Exception dalam utas utama MyExc1."
Atas ialah kandungan terperinci Bagaimanakah penyebaran pengecualian berfungsi apabila pengecualian dilemparkan dalam tangkapan dan akhirnya disekat di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!