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 catch
blok iaitu kod pendua.
Keterkaitan operator penugasan =
adalah dari kanan ke kiri, jadi seseorang ArithmeticException
dilemparkan 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 catch
blok.
Setiap jenis pengecualian yang dapat ditangani oleh catch
blok 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 catch
blok mengurangkan penduaan kod dan meningkatkan kecekapan.
Bytecode yang dihasilkan semasa menyusun program ini akan lebih kecil daripada program yang mempunyai banyak catch
blok kerana tidak ada redundansi kod.
Catatan: Jika catch
blok 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 catch
blok, peraturan tersebut digeneralisasikan kepada khusus.
Ini bermaksud bahawa jika terdapat hierarki pengecualian di catch
blok, 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 Exception
kelas. Oleh itu, daripada menangkap beberapa pengecualian khusus, kita hanya dapat mengikuti Exception
kelas.
Sekiranya kelas pengecualian asas telah ditentukan dalam catch
blok, jangan gunakan kelas pengecualian anak di catch
blok 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, ArithmeticException
dan ArrayIndexOutOfBoundsException
merupakan kedua-dua sub Exception
kelas. Jadi, kami mendapat ralat penyusunan.