Rumah  >  Artikel  >  Java  >  Bagaimanakah penyebaran pengecualian berfungsi apabila pengecualian dilemparkan dalam tangkapan dan akhirnya disekat di Jawa?

Bagaimanakah penyebaran pengecualian berfungsi apabila pengecualian dilemparkan dalam tangkapan dan akhirnya disekat di Jawa?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 20:09:03825semak imbas

How does exception propagation work when exceptions are thrown within catch and finally blocks in Java?

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:

  • Blok Tangkapan: Apabila pengecualian i dilemparkan dalam blok tangkapan, ia serta-merta digantikan dengan pengecualian baharu MyExc2, yang menjadi pengecualian yang sedang dijalankan.
  • Akhirnya Sekat: Begitu juga, apabila pengecualian dilemparkan dalam blok akhirnya, ia menggantikan pengecualian MyExc2 semasa dengan MyExc1, menjadikannya pengecualian baharu yang sedang dijalankan.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn