Dalam tutorial ini, kita akan belajar menangani beberapa pengecualian di Java dengan bantuan contoh.
Sebelum Java 7, kita harus menulis beberapa kod pengendalian pengecualian untuk pelbagai jenis pengecualian walaupun terdapat redundansi kod.
Mari kita ambil contoh.
Contoh 1: Banyak blok tangkapan
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Pengeluaran
/ dengan sifar
Dalam contoh ini, dua pengecualian mungkin berlaku:
ArithmeticExceptionkerana kita cuba membahagikan nombor dengan 0.ArrayIndexOutOfBoundsExceptionkerana kami telah menyatakan susunan bilangan bulat baru dengan batasan array 0 hingga 9 dan kami berusaha memberikan nilai ke indeks 10.
Kami mencetak mesej pengecualian di kedua catchblok iaitu kod pendua.
Keterkaitan operator penugasan =adalah dari kanan ke kiri, jadi seseorang ArithmeticExceptiondilemparkan terlebih dahulu dengan mesej / dengan sifar.
Tangani Pengecualian Pelbagai dalam Blok tangkapan
Di Java SE 7 dan yang lebih baru, sekarang kita dapat menangkap lebih dari satu jenis pengecualian dalam satu catchblok.
Setiap jenis pengecualian yang dapat ditangani oleh catchblok dipisahkan menggunakan bar atau paip menegak |.
Sintaksnya adalah:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Contoh 2: Blok tangkapan pelbagai
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Pengeluaran
/ dengan sifar
Menangkap beberapa pengecualian dalam satu catchblok mengurangkan penduaan kod dan meningkatkan kecekapan.
Bytecode yang dihasilkan semasa menyusun program ini akan lebih kecil daripada program yang mempunyai banyak catchblok kerana tidak ada redundansi kod.
Catatan: Jika catchblok menangani beberapa pengecualian, parameter tangkapan secara tidak langsung final. Ini bermaksud kita tidak dapat menetapkan nilai apa pun untuk menangkap parameter.
Pengecualian asas penangkapan
Semasa menangkap beberapa pengecualian dalam satu catchblok, peraturan tersebut digeneralisasikan kepada khusus.
Ini bermaksud bahawa jika terdapat hierarki pengecualian di catchblok, kita hanya dapat memperoleh pengecualian dasar dan bukannya menangkap beberapa pengecualian khusus.
Mari kita ambil contoh.
Contoh 3: Menangkap kelas pengecualian asas sahaja
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) )
Pengeluaran
/ dengan sifar
Kami tahu bahawa semua kelas pengecualian adalah subkelas Exceptionkelas. Oleh itu, daripada menangkap beberapa pengecualian khusus, kita hanya dapat mengikuti Exceptionkelas.
Sekiranya kelas pengecualian asas telah ditentukan dalam catchblok, jangan gunakan kelas pengecualian anak di catchblok yang sama . Jika tidak, kami akan mendapat ralat penyusunan.
Mari kita ambil contoh.
Contoh 4: Kelas penangkapan dasar dan pengecualian kanak-kanak
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Pengeluaran
Main.java:6: ralat: Alternatif dalam pernyataan multi-tangkapan tidak dapat dihubungkan dengan subkelas
Dalam contoh ini, ArithmeticExceptiondan ArrayIndexOutOfBoundsExceptionmerupakan kedua-dua sub Exceptionkelas. Jadi, kami mendapat ralat penyusunan.








