Cara pelbagai tangkapan berfungsi - 1

"Beberapa lagi pelajaran yang menarik. Oh, saya suka mengajar!"

"Saya ingin memberitahu anda tentang cara berbilang blok tangkapan berfungsi. Ia sangat mudah: apabila pengecualian berlaku dalam blok percubaan , pelaksanaan beralih ke blok tangkapan pertama ."

"Jika jenis yang ditunjukkan dalam kurungan blok tangkapan sepadan dengan jenis pengecualian yang dilemparkan, maka pelaksanaan bermula di dalam blok itu. Jika tidak, kita beralih ke blok tangkapan seterusnya , di mana semakan yang sama dilakukan."

"Jika kami kehabisan blok tangkapan dan pengecualian belum ditangkap, ia akan dibaling semula, dan kaedah semasa akan ditamatkan secara tidak normal."

"Saya faham. Blok tangkapan yang bertepatan dengan jenis pengecualian akan menjadi yang dilaksanakan."

"Ya, betul. Namun, pada hakikatnya ia agak rumit. Kelas boleh mewarisi kelas lain. Jika kelas Lembu mewarisi kelas Haiwan, objek Lembu mungkin dirujuk bukan sahaja oleh pembolehubah Lembu, tetapi juga oleh pembolehubah Haiwan. "

"Dan?"

"Oleh kerana semua pengecualian mewarisi Exception atau RuntimeException (yang turut mewarisi Exception ), ia masih boleh ditangkap menggunakan 'catch ( Exception e)' atau ' catch (RuntimeException e) '."

"Dan?"

"Kami boleh membuat dua kesimpulan. Pertama, anda boleh menggunakan 'tangkapan (Pengecualian e)' untuk menangkap sebarang pengecualian. Kedua, susunan blok tangkapan penting. "

"Berikut adalah beberapa contoh:"

" ArithmeticExceptionYang berlaku selepas kita bahagi dengan 0 akan ditangkap dalam blok tangkapan kedua."

Kod
try
{
    System.out.println("Before calling method1.");
    int a = 1 / 0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
    System.out.println("Division by zero. Exception has been caught.");
}
catch (Exception e)
{
    System.out.println("Any other errors. Exception has been caught.");
}

"Dalam contoh di bawah, yang ArithmeticExceptionakan ditangkap dalam blok tangkapan pertama, kerana semua pengecualian mewarisi Pengecualian, iaitu Exceptionmeliputi semua pengecualian. "

Kod
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (Exception e)
{
    System.out.println("Any other errors. Exception has been caught.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
    System.out.println("Divided by zero. Exception has been caught.");
}

"Dalam contoh di bawah, ArithmeticExceptiontidak akan ditangkap. Ia akan dikembalikan kepada kaedah panggilan."

Kod
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}

"Itu menjelaskan sedikit perkara. Pengecualian ini bukanlah topik yang paling mudah."

"Nampaknya begitu sahaja. Mereka sebenarnya adalah salah satu perkara paling mudah di Jawa."

"Saya tidak tahu sama ada mahu gembira atau sedih tentang perkara itu…"