Dalam tutorial ini, kita akan belajar menangani banyak pengecualian di Java dengan bantuan contoh.
Sebelum Java 7, kami harus menulis beberapa kode penanganan pengecualian untuk berbagai jenis pengecualian meskipun ada redundansi kode.
Mari kita ambil contoh.
Contoh 1: Beberapa 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()); ) ) )
Keluaran
/ dengan nol
Dalam contoh ini, dua pengecualian dapat terjadi:
ArithmeticException
karena kami mencoba membagi angka dengan 0.ArrayIndexOutOfBoundsException
karena kita telah mendeklarasikan array integer baru dengan batas array 0 sampai 9 dan kita mencoba untuk memberikan nilai pada indeks 10.
Kami mencetak pesan pengecualian di kedua catch
blok yaitu kode duplikat.
Keterkaitan operator penugasan =
adalah dari kanan ke kiri, jadi an ArithmeticException
dilemparkan terlebih dahulu dengan pesan / oleh nol.
Tangani Beberapa Pengecualian dalam blok tangkapan
Di Java SE 7 dan yang lebih baru, kami sekarang dapat menangkap lebih dari satu jenis pengecualian dalam satu catch
blok.
Setiap jenis pengecualian yang dapat ditangani oleh catch
blok dipisahkan menggunakan batang atau pipa vertikal |
.
Sintaksnya adalah:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Contoh 2: Blok multi-tangkapan
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()); ) ) )
Keluaran
/ dengan nol
Menangkap beberapa pengecualian dalam satu catch
blok mengurangi duplikasi kode dan meningkatkan efisiensi.
Bytecode yang dihasilkan saat menyusun program ini akan lebih kecil daripada program yang memiliki banyak catch
blok karena tidak ada redundansi kode.
Catatan: Jika sebuah catch
blok menangani beberapa pengecualian, parameter catch secara implisit final
. Ini berarti kami tidak dapat menetapkan nilai apa pun untuk menangkap parameter.
Menangkap Pengecualian dasar
Saat menangkap beberapa pengecualian dalam satu catch
blok, aturan tersebut digeneralisasi menjadi khusus.
Ini berarti bahwa jika ada hierarki pengecualian di catch
blok, kita hanya dapat menangkap pengecualian dasar daripada menangkap beberapa pengecualian khusus.
Mari kita ambil contoh.
Contoh 3: Menangkap kelas pengecualian dasar saja
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()); ) ) )
Keluaran
/ dengan nol
Kita tahu bahwa semua kelas pengecualian adalah subkelas dari Exception
kelas tersebut. Jadi, alih-alih menangkap beberapa pengecualian khusus, kita cukup menangkap Exception
kelasnya.
Jika kelas pengecualian dasar telah ditentukan di catch
blok, jangan gunakan kelas pengecualian anak di catch
blok yang sama . Jika tidak, kami akan mendapatkan kesalahan kompilasi.
Mari kita ambil contoh.
Contoh 4: Menangkap kelas dasar dan pengecualian anak
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()); ) ) )
Keluaran
Main.java:6: error: Alternatif dalam pernyataan multi-catch tidak dapat dihubungkan dengan subclassing
Dalam contoh ini, ArithmeticException
dan ArrayIndexOutOfBoundsException
keduanya merupakan subclass dari Exception
kelas. Jadi, kami mendapatkan kesalahan kompilasi.