Exception Handling
Menangani error secara elegan agar aplikasi tidak crash.
1. Pengantar & Analogi Dunia Nyata
Bayangkan kamu sedang Ujian Online di kampus. Normalnya, alur ujian itu lancar: Login -> Kerjakan Soal -> Submit -> Selesai.
Tapi, dunia nyata tidak selalu sempurna. Banyak hal bisa salah:
- Koneksi putus saat submit (IOException).
- File jawaban corrupt (DataFormatException).
- Waktu habis sebelum submit (TimeOutException).
Kalau sistem kampus jelek, begitu ada error sedikit, websitenya langsung CRASH (layar putih/error 500), dan jawabanmu hilang semua. Mahasiswa panik, dosen marah.
Sistem yang bagus punya Exception Handling. Kalau koneksi putus, dia tidak crash, tapi memunculkan pesan: "Koneksi terganggu, mencoba menyimpan jawaban lokal...".
Inilah Exception Handling: Mekanisme penyelamat saat terjadi hal yang tidak diinginkan, supaya program tetap berjalan atau mati dengan terhormat (graceful exit).
Komponen Utama (Analogi)
try(Percobaan): "Coba kirim jawaban ujian ini..."catch(Penanganan): "KALAU koneksi putus, tolong simpan di draft dulu."finally(Wajib): "Mau sukses atau gagal, TANTAP catat log aktivitas mahasiswa ini di server."throw(Melempar Masalah): Mahasiswa lapor ke pengawas, "Pak, komputer saya mati!"throws(Peringatan): Di pintu ruang ujian ada tulisan: "AWAS! Ruangan ini berpotensi mati lampu."
2. Konsep Teknis
Di Java, Exception adalah object yang merepresentasikan error atau kondisi tidak normal.
Ada dua jenis utama Exception:
A. Checked Exception (Wajib Diurus)
Ini seperti Bencana Alam atau Masalah Eksternal. Java mewajibkan kita untuk menanganinya (try-catch) atau mendeklarasikannya (throws).
- Contoh:
IOException(File gak ada),SQLException(Database mati). - Analogi: "Hujan Badai". Kita harus bawa payung (
catch) sebelum keluar rumah. Kalau gak, compiler bakal marah.
B. Unchecked / Runtime Exception (Kecerobohan Programmer)
Ini seperti Keteledoran Sendiri. Java tidak memaksa kita menanganinya, tapi kalau terjadi, program akan crash. Biasanya karena logika coding yang salah.
- Contoh:
NullPointerException(Object kosong diakses),ArrayIndexOutOfBoundsException(Akses array di luar batas),ArithmeticException(Bagi dengan nol). - Analogi: "Lupa bawa kartu ujian". Itu salahmu sendiri, bukan salah alam semesta.
3. Komponen Utama
Struktur dasar penanganan error di Java:
Penting!
Blok finally akan SELALU dieksekusi, baik terjadi error maupun tidak.
Biasanya dipakai untuk bersih-bersih (tutup koneksi database, tutup file, dll).
4. Studi Kasus Koding (Java)
Kita buat sistem Upload Tugas. Kita akan simulasikan error kalau file terlalu besar atau kalau format salah.
File: SistemUpload.java
public class SistemUpload {
// Method ini BERPOTENSI error (Checked Exception)
// Kita kasih peringatan 'throws Exception'
public static void uploadTugas(String namaFile, int ukuranMB) throws Exception {
System.out.println("Mencoba upload " + namaFile + "...");
// Simulasi Validasi
if (ukuranMB > 50) {
// Melempar error secara sengaja
throw new Exception("FileTerlaluBesar: Maksimal 50MB!");
}
if (!namaFile.endsWith(".pdf")) {
throw new IllegalArgumentException("FormatSalah: Harus PDF!");
}
System.out.println("Sukses! File " + namaFile + " diterima.");
}
public static void main(String[] args) {
// Kasus 1: Mahasiswa Rajin (Sukses)
System.out.println("--- Percobaan 1 ---");
try {
uploadTugas("TugasAkhir.pdf", 10);
} catch (Exception e) {
System.out.println("Gagal: " + e.getMessage());
}
// Kasus 2: Mahasiswa File Gede (Error Checked)
System.out.println("\n--- Percobaan 2 ---");
try {
uploadTugas("VideoDokumenter.mp4", 120);
} catch (Exception e) {
// Menangkap error yang dilempar tadi
System.out.println("❌ ERROR TERTANGKAP: " + e.getMessage());
System.out.println("Solusi: Kompres file video kamu.");
} finally {
System.out.println("Sistem: Sesi upload ditutup.");
}
// Kasus 3: Kecerobohan (Unchecked Exception - Bagi 0)
System.out.println("\n--- Percobaan 3 (Runtime Error) ---");
try {
int nilai = 100;
int pembagi = 0; // Kecerobohan programmer
int hasil = nilai / pembagi;
} catch (ArithmeticException e) {
System.out.println("❌ FATAL: Jangan membagi dengan nol! (" + e.getMessage() + ")");
}
}
}5. Bedah Kode
throws Exception:- Method
uploadTugasngasih peringatan: "Eh, gue bisa error loh ya. Siapapun yang panggil gue, harus siap-siapcatcherrornya."
- Method
throw new Exception(...):- Ini cara kita membuat error secara manual. "Kalau file > 50MB, LEMPAR ERROR!". Program langsung berhenti di baris ini dan loncat ke
catch.
- Ini cara kita membuat error secara manual. "Kalau file > 50MB, LEMPAR ERROR!". Program langsung berhenti di baris ini dan loncat ke
try { ... }:- Wilayah aman. Kode yang berisiko ditaruh di sini.
catch (Exception e) { ... }:- Jaring pengaman. Kalau di dalam
tryada yang melempar error,catchakan menangkapnya. Variabeleberisi detail errornya.
- Jaring pengaman. Kalau di dalam
finally { ... }:- Kode yang setia. Dia akan jalan terus, mau error atau sukses. Di contoh Kasus 2, kita lihat "Sesi upload ditutup" tetap muncul meskipun upload gagal.
6. Latihan
Sebuah aplikasi kalkulator sering crash saat pengguna mencoba membagi angka dengan nol. Kamu diminta membuat fungsi pembagian yang aman dan memberikan pesan error yang jelas.
Buatlah class Calculator yang menangani error aritmatika:
1. Static Method
divide(int a, int b): Menerima dua angka.- Validasi: Jika
b == 0, lempar error:throw new IllegalArgumentException("Tidak bisa membagi dengan nol!"); - Sukses: Kembalikan hasil pembagian integer
a / b.
Tips: Method ini harus mendeklarasikan bahwa ia bisa melempar error, atau melempar runtime exception seperti di atas.
Output yang Diharapkan
Kasus Valid (10 / 2):
Hasil: 5Kasus Error (10 / 0):
Error: Tidak bisa membagi dengan nol!7. Kesimpulan
Exception Handling membuat aplikasimu Tangguh.
- Tanpa
try-catch: Aplikasi crash, user lihat pesan error aneh, user uninstall aplikasi. - Dengan
try-catch: Aplikasi bertahan, user dikasih tau "Maaf file kegedean", user coba lagi.
Ingat mantra ini: "Catch the specific, not the generic".
Sebaiknya catch (NullPointerException e) daripada cuma catch (Exception e) biar penanganannya lebih spesifik!