Pengendalian Pengecualian dalam Java: Memahami Kesan Pengecualian yang Dilemparkan ke dalam Klausa Tangkapan dan Akhirnya
Pertimbangkan coretan kod berikut:
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(); // throws MyExc1 here } } static void q() throws Exception { try { throw new MyExc1(); // throws MyExc1 here } catch (Exception y) { } finally { System.out.print(3); throw new Exception(); // throws Exception here } } }
Dalam coretan ini, kami mempunyai urutan pengecualian yang dilemparkan dalam fasal cuba-tangkap dan akhirnya. Output yang dijangkakan ialah "132Exception dalam utas utama MyExc1," bukan "13Exception dalam utas utama MyExc2."
Memahami hasil ini memerlukan pemahaman prinsip asas pengendalian pengecualian dalam Java:
Apabila pengecualian baharu dilemparkan dalam tangkapan atau klausa akhirnya yang merambat keluar dari blok itu, pengecualian semasa akan digugurkan dan pengecualian baharu akan disebarkan sebaliknya.
Pada asasnya, pengecualian semasa dilupakan, dan pengecualian baharu mengambil alih proses pelepasan sehingga timbunan.
Dalam kod yang diberikan, pengecualian MyExc1 dilemparkan ke dalam klausa akhirnya yang paling dalam. Pengecualian ini akhirnya akan menggelembung ke klausa akhirnya utama. Walau bagaimanapun, dalam klausa akhirnya itu, satu lagi pengecualian, MyExc1 dilemparkan, menggugurkan penyebaran MyExc1 asal. Oleh itu, MyExc1 klausa paling luar akhirnya menjadi pengecualian yang disebarkan ke luar.
Atas ialah kandungan terperinci Mengapa pengecualian dilemparkan dalam blok akhirnya adalah yang akhirnya dilaporkan di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!