Menyusun Program · Pelajaran 9 dari 10
Exception
9 menit baca · BelajarCode
Exception adalah objek yang mewakili keadaan tidak normal saat program berjalan, misalnya membagi dengan nol atau mengubah teks yang bukan angka.
1public class Main {2 public static void main(String[] args) {3 String[] masukan = {"42", "abc", "0"};4 for (String teks : masukan) {5 try {6 int angka = Integer.parseInt(teks);7 System.out.println("100 / " + angka + " = " + (100 / angka));8 } catch (NumberFormatException e) {9 System.out.println("Bukan angka: " + e.getMessage());10 } catch (ArithmeticException e) {11 System.out.println("Kesalahan hitung: " + e.getMessage());12 } finally {13 System.out.println("Selesai memproses \"" + teks + "\"");14 }15 }16 }17}100 / 42 = 2 Selesai memproses "42" Bukan angka: For input string: "abc" Selesai memproses "abc" Kesalahan hitung: / by zero Selesai memproses "0"
- Kode yang mungkin gagal ditaruh di blok
try. - Setiap
catchmenangkap jenis exception tertentu. finallyselalu dijalankan, ada exception atau tidak.
| Exception | Penyebab |
|---|---|
NullPointerException | Memanggil metode pada variabel yang bernilai null |
ArrayIndexOutOfBoundsException | Indeks array di luar batas |
NumberFormatException | Mengubah teks yang bukan angka dengan parseInt |
ArithmeticException | Pembagian bilangan bulat dengan nol |
IllegalArgumentException | Argumen metode tidak valid |
Checked dan unchecked
- Unchecked exception (turunan
RuntimeException), seperti contoh di tabel, biasanya menandakan kesalahan program. Tidak wajib ditangkap. - Checked exception (turunan
Exceptiontetapi bukanRuntimeException) mewakili keadaan yang bisa diperkirakan, misalnya file tidak ditemukan. Kompiler mewajibkan exception ini ditangkap atau dideklarasikan denganthrows.
Exception buatan sendiri
1class SaldoTidakCukupException extends Exception {2 SaldoTidakCukupException(long saldo, long diminta) {3 super("Saldo Rp" + saldo + " tidak cukup untuk menarik Rp" + diminta);4 }5}67class Rekening {8 private long saldo;910 Rekening(long saldo) {11 this.saldo = saldo;12 }1314 void tarik(long jumlah) throws SaldoTidakCukupException {15 if (jumlah <= 0) {16 throw new IllegalArgumentException("Jumlah harus positif");17 }18 if (jumlah > saldo) {19 throw new SaldoTidakCukupException(saldo, jumlah);20 }21 saldo -= jumlah;22 }2324 long getSaldo() {25 return saldo;26 }27}2829public class Main {30 public static void main(String[] args) {31 Rekening r = new Rekening(100000);32 long[] penarikan = {30000, 90000, -5};33 for (long jumlah : penarikan) {34 try {35 r.tarik(jumlah);36 System.out.println("Berhasil tarik " + jumlah + ", sisa " + r.getSaldo());37 } catch (SaldoTidakCukupException e) {38 System.out.println("Gagal: " + e.getMessage());39 } catch (IllegalArgumentException e) {40 System.out.println("Ditolak: " + e.getMessage());41 }42 }43 }44}Berhasil tarik 30000, sisa 70000 Gagal: Saldo Rp70000 tidak cukup untuk menarik Rp90000 Ditolak: Jumlah harus positif
throws SaldoTidakCukupException pada metode memberi tahu pemanggil bahwa exception ini mungkin dilempar dan wajib ditangani.
Jangan menelan exception
Blok catch (Exception e) { } yang kosong menyembunyikan kesalahan. Program terlihat berjalan, padahal ada yang salah. Minimal, tampilkan atau catat pesan exception-nya.
Cek pemahaman
Apa perbedaan utama checked exception dan unchecked exception?
Latihan
Validasi umur
Buat metode static int bacaUmur(String teks) yang mengubah teks menjadi umur. Lempar IllegalArgumentException dengan pesan yang jelas jika teks bukan angka atau umurnya di luar 0 sampai 150. Uji dengan "25", "dua", dan "200".
Pembahasan
1public class Main {2 static int bacaUmur(String teks) {3 int umur;4 try {5 umur = Integer.parseInt(teks.trim());6 } catch (NumberFormatException e) {7 throw new IllegalArgumentException("\"" + teks + "\" bukan angka");8 }9 if (umur < 0 || umur > 150) {10 throw new IllegalArgumentException("Umur " + umur + " tidak masuk akal");11 }12 return umur;13 }1415 public static void main(String[] args) {16 for (String t : new String[]{"25", "dua", "200"}) {17 try {18 System.out.println("Umur valid: " + bacaUmur(t));19 } catch (IllegalArgumentException e) {20 System.out.println("Ditolak: " + e.getMessage());21 }22 }23 }24}Umur valid: 25 Ditolak: "dua" bukan angka Ditolak: Umur 200 tidak masuk akal
NumberFormatException ditangkap lalu diganti dengan pesan yang lebih jelas bagi pemanggil.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Java online.