Rumah >Java >javaTutorial >Mengapakah kod pengendalian pengecualian Java menghasilkan \'132Exception dalam utas utama MyExc1\' dan bukannya \'13Exception dalam utas utama MyExc2\'?

Mengapakah kod pengendalian pengecualian Java menghasilkan \'132Exception dalam utas utama MyExc1\' dan bukannya \'13Exception dalam utas utama MyExc2\'?

Linda Hamilton
Linda Hamiltonasal
2024-10-29 18:38:121026semak imbas

Why does the Java exception handling code produce

Pengendalian Pengecualian dalam Java: Membongkar Kekaburan

Dalam senario pengendalian pengecualian Java yang membingungkan, soalan universiti mengemukakan coretan kod berikut:

<code class="java">// Exception Heirarchy
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

// Main Class
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>

Soalan bertanyakan outputnya, dan jawapan yang diberikan ialah "13Exception in thread main MyExc2". Walau bagaimanapun, jawapan yang betul ialah "132Exception in thread main MyExc1".

Menjelaskan Kekaburan

Untuk menguraikan teka-teki ini, adalah penting untuk memahami keutamaan pengecualian:

  • Prinsip: Apabila pengecualian baharu dilemparkan ke dalam tangkapan atau akhirnya blok, pengecualian semasa yang dikendalikan akan dibatalkan.
  • Akibatnya :

    • Penyebaran pengecualian semasa dihentikan.
    • Pengecualian baharu menjadi pengecualian penyebaran.
    • Pengecualian baharu membuka timbunan seperti biasa, menghadapi sebarang tangkapan yang berkenaan atau akhirnya disekat.

Menjejaki Semula Pelaksanaan

Menggunakan prinsip ini pada kod:

  1. Pelaksanaan Awal:

    • Baris 13: MyExc1 dilemparkan ke dalam blok percubaan q().
    • Baris 18: The MyExc1 terperangkap dalam blok tangkapan q().
    • Baris 21: Baris 21 dilaksanakan (cetakan 3).
  2. Catch Block Pengecualian:

    • Baris 19: MyExc2 dibuang ke dalam blok tangkapan utama().
    • Baris 22: MyExc2 membatalkan pembiakan MyExc1.
    • Baris 19: MyExc2 mula membuka timbunan.
  3. Sambungan Pelaksanaan di Blok Percubaan Utama:

    • Barisan 15 : Baris 15 dilaksanakan (cetakan 2).
    • Baris 16: MyExc1 dibuang dalam blok akhirnya main().
    • Baris 16: MyExc1 membatalkan penyebaran MyExc2.
    • Baris 16: MyExc1 mula membuka timbunan (dan masih tertakluk kepada blok akhirnya utama).
  4. Akhirnya Sekat Pengecualian:

    • Baris 23: Pengecualian dilemparkan ke dalam blok akhir utama().
    • Baris 23: Pengecualian membatalkan penyebaran MyExc1.
    • Baris 23: Pengecualian mula dibuka atas timbunan.

Output:

Output akhir ialah "132Exception dalam utas utama MyExc1" kerana pengecualian yang merambat keluar daripada kaedah utama ialah MyExc1 yang dibaling dalam baris 16. MyExc2 yang dilemparkan dalam baris 19 dibatalkan apabila MyExc1 dilemparkan dalam baris 16.

Atas ialah kandungan terperinci Mengapakah kod pengendalian pengecualian Java menghasilkan \'132Exception dalam utas utama MyExc1\' dan bukannya \'13Exception dalam utas utama MyExc2\'?. 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