Rumah >Java >javaTutorial >Mengapakah coretan kod menghasilkan output \'132Exception dalam utas utama MyExc1\' walaupun fakta bahawa pengecualian MyExc2 dilemparkan ke dalam blok tangkapan?

Mengapakah coretan kod menghasilkan output \'132Exception dalam utas utama MyExc1\' walaupun fakta bahawa pengecualian MyExc2 dilemparkan ke dalam blok tangkapan?

Barbara Streisand
Barbara Streisandasal
2024-10-29 22:30:29769semak imbas

Why does the code snippet produce the output

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:

  1. Apabila pengecualian dilemparkan dalam tangkapan atau akhirnya blok yang akan disebarkan keluar dari blok itu, pengecualian semasa secara automatik dibatalkan dan dilupakan.
  2. Pengecualian baharu mula membuka timbunan, mematuhi sebarang tangkapan atau akhirnya menyekat sepanjang jalan.
  3. Terutamanya, pengecualian baharu yang dilemparkan dalam blok tangkapan masih tertakluk pada blok akhirnya tangkapan itu, jika ada.
Pengecualian dilemparkan dalam kaedah q dan ditangkap oleh blok tangkapan di utama.

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.
  • Pengecualian baharu ialah Pengecualian yang tidak ditangkap dalam blok tangkapan kaedah q.
  • Pengecualian Pengecualian merambat keluar dari kaedah q dan ke dalam blok akhirnya dalam kaedah utama.
  • Blok akhirnya dalam cetakan utama "3" dan kemudian membuang pengecualian MyExc1.
  • Pengecualian MyExc1 merambat keluar daripada kaedah utama dan ditangkap oleh mesin maya.
  • Memahami Output
  • Daripada pengesanan ini, kita dapat melihat bahawa:
  • Pengecualian terakhir yang merambat keluar daripada kaedah utama ialah MyExc1.
Surih tindanan termasuk "132," yang sepadan dengan output yang dicetak oleh atur cara.

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!

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