Exception Handling
try/catch/finally, jenis exception (checked vs unchecked), throw dan throws, exception buatan sendiri, dan try-with-resources.
Apa itu exception?
Exception adalah kejadian tak terduga saat program berjalan: membagi dengan nol, mengakses indeks di luar array, berkas tidak ditemukan, input bukan angka. Tanpa penanganan, program berhenti dengan stack trace. Dengan penanganan, program bisa pulih atau gagal dengan sopan.
int a = 10 / 0; // ArithmeticException: / by zero
try / catch / finally
try {
int angka = Integer.parseInt("abc");
System.out.println(angka);
} catch (NumberFormatException e) {
System.out.println("Bukan angka: " + e.getMessage());
} finally {
System.out.println("Selalu dijalankan");
}
try— kode yang berisiko.catch— penanganan jika exception terjadi. Boleh banyakcatch; tulis yang spesifik dulu, umum belakangan.finally— selalu jalan (berhasil ataupun gagal); cocok untuk membersihkan sumber daya.- Gabung beberapa jenis:
catch (IOException | SQLException e).
Hierarki exception
| Jenis | Contoh | Aturan |
|---|---|---|
Checked (turunan Exception) | IOException, SQLException | Compiler memaksa ditangani atau dideklarasikan dengan throws |
Unchecked (turunan RuntimeException) | NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException | Tidak dipaksa; biasanya akibat bug yang harus diperbaiki |
| Error | OutOfMemoryError, StackOverflowError | Masalah serius JVM; jangan ditangkap |
throw dan throws
static void tarik(double saldo, double jumlah) throws SaldoKurangException {
if (jumlah > saldo) {
throw new SaldoKurangException("Saldo tidak cukup");
}
}
throw— melempar satu exception (pernyataan).throws— pada deklarasi method, memberi tahu pemanggil bahwa method ini mungkin melempar exception checked.
Exception buatan sendiri
class SaldoKurangException extends Exception {
public SaldoKurangException(String pesan) {
super(pesan);
}
}
Turunkan dari Exception (checked) bila pemanggil wajib menangani, atau dari RuntimeException (unchecked) untuk pelanggaran aturan/kesalahan pemrograman. Pakai nama yang menjelaskan masalah dan akhiri dengan Exception.
try-with-resources
Sumber daya seperti berkas atau koneksi harus ditutup. Dengan try-with-resources, objek yang mengimplementasikan AutoCloseable ditutup otomatis, bahkan ketika terjadi exception:
try (Scanner in = new Scanner(System.in)) {
System.out.print("Angka: ");
int n = in.nextInt();
System.out.println(n * 2);
} catch (InputMismatchException e) {
System.out.println("Harus angka!");
} // in.close() dipanggil otomatis
Praktik baik
- Jangan telan exception dengan
catchkosong; setidaknya catat atau tampilkan pesannya, karena kegagalan yang tersembunyi sulit dilacak. - Tangkap exception yang spesifik, hindari
catch (Exception e)kecuali di batas terluar program. - Jangan memakai exception sebagai pengganti
ifuntuk alur normal. - Sertakan pesan yang jelas: apa yang salah dan nilai yang bermasalah.
- Validasi di awal method (fail fast), contohnya melempar
IllegalArgumentExceptionuntuk argumen tidak valid.
Membaca stack trace
Baris paling atas menyebut jenis exception dan pesannya; baris at ... di bawahnya menunjukkan rantai pemanggilan. Cari baris pertama yang berisi nama class milikmu — di situlah biasanya sumber masalahnya.