Java menangkap Pelbagai Pengecualian

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:

  • ArithmeticException kerana kita cuba membahagikan nombor dengan 0.
  • ArrayIndexOutOfBoundsException kerana 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.

Artikel menarik...