Menguasai Penanganan Pengecualian Java: Try, Catch, Finally, dan Sumber Daya
Menguasai Penanganan Pengecualian Java
Jelajahi bagaimana mekanisme try-catch-finally dan try-with-resources Java membantu Anda menulis kode yang tangguh dan bebas kesalahan.
Konstruk try…catch adalah pusat penanganan kesalahan yang anggun di Java. Ini memungkinkan program untuk mengantisipasi masalah runtime dan merespons tanpa crash.
Di bawah ini adalah sintaks kanonik:
try { // kode yang mungkin melempar pengecualian } catch (ExceptionType e) { // tangani pengecualian }
Blok try berisi kode yang mungkin melempar pengecualian. Jika pengecualian terjadi, kontrol meloncat ke blok catch yang cocok, yang kemudian dapat bereaksi dengan tepat.
Contoh: Menangani ArithmeticException
class Main { public static void main(String[] args) { try { int result = 5 / 0; System.out.println("Baris ini tidak pernah tercapai."); } catch (ArithmeticException e) { System.out.println("Tangkap: " + e.getMessage()); } } }
Output
Tangkap: / by zero
Di sini, pembagian dengan nol memicu ArithmeticException. Blok catch menangkapnya, mencegah crash program.
Tips: Anda dapat menghilangkan blok catch jika Anda hanya tertarik untuk memastikan blok finally berjalan, tetapi blok catch tidak dapat ada tanpa try yang sebelumnya.
Menggunakan Blok Finally
Klausa finally menjamin eksekusi terlepas dari apakah pengecualian dilempar atau tidak:
class Main { public static void main(String[] args) { try { int result = 5 / 0; } finally { System.out.println("Tindakan pembersih berjalan di sini."); } } }
Output
Tindakan pembersih berjalan di sini. Exception in thread "main" java.lang.ArithmeticException: / by zero at Main.main(Main.java:4)
Blok finally dieksekusi setelah blok try, bahkan ketika pengecualian mengganggu aliran normal.
Menggabungkan Try, Catch, dan Finally
Kode yang kokoh biasanya menggunakan ketiga klausa untuk menangani kesalahan, melaporkan mereka, dan membersihkan sumber daya. Pertimbangkan contoh penanganan file ini:
import java.io.*; class ListOfNumbers { private int[] list = {5, 6, 8, 9, 2}; public void writeList() { PrintWriter out = null; try { System.out.println("Mencoba menulis ke file."); out = new PrintWriter(new FileWriter("OutputFile.txt")); for (int i = 0; i < 7; i++) { out.println("Nilai pada: " + i + " = " + list[i]); } } catch (Exception e) { System.out.println("Pengecualian: " + e.getMessage()); } finally { if (out != null) { System.out.println("Menutup PrintWriter"); out.close(); } else { System.out.println("PrintWriter tidak dibuka."); } } } } class Main { public static void main(String[] args) { new ListOfNumbers().writeList(); } }
Output
Mencoba menulis ke file. Pengecualian: Index 5 out of bounds for length 5 Menutup PrintWriter
Perhatikan pelanggaran batas array memicu pengecualian, yang ditangkap dan dilaporkan. Blok finally memastikan PrintWriter ditutup, mencegah kebocoran sumber daya.
Praktik terbaik: Selalu letakkan logika pembersih—menutup file, soket, atau koneksi database—di dalam blok finally.
Catatan: finally mungkin tidak berjalan jika JVM keluar (misalnya, System.exit()), pengecualian terjadi di dalam finally, atau thread secara mendadak diakhiri.
Menangani Beberapa Jenis Pengecualian
Satu try dapat diikuti oleh beberapa klausa catch, masing-masing disesuaikan dengan pengecualian tertentu:
class ListOfNumbers { private int[] arr = new int[10]; public void writeList() { try { arr[10] = 11; } catch (NumberFormatException e) { System.out.println("NumberFormatException: " + e.getMessage()); } catch (IndexOutOfBoundsException e) { System.out.println("IndexOutOfBoundsException: " + e.getMessage()); } } } class Main { public static void main(String[] args) { new ListOfNumbers().writeList(); } }
Output
IndexOutOfBoundsException: Index 10 out of bounds for length 10
Runtime pertama mencoba blok catch pertama; jika tidak cocok, ia melanjutkan ke yang berikutnya hingga cocok ditemukan.
Menangkap Beberapa Pengecualian dalam Satu Klausa (Java 7+)
Java 7 memperkenalkan kemampuan untuk menggabungkan jenis pengecualian dalam satu catch, mengurangi duplikasi:
try { // kode berisiko } catch (IOException | SQLException ex) { // penanganan gabungan }
Gunakan fitur ini ketika pengecualian berbeda dapat ditangani secara identik.
Try-With-Resources untuk Pembersihan Otomatis
Pernyataan try-with-resources secara otomatis menutup sumber daya apa pun yang mengimplementasikan AutoCloseable:
try (PrintWriter out = new PrintWriter(new FileWriter("OutputFile.txt"))) { // gunakan sumber daya } catch (IOException e) { // tangani kesalahan I/O }
Karena sumber daya dideklarasikan dalam tanda kurung, ia ditutup secara otomatis saat blok keluar, bahkan jika pengecualian terjadi.
Untuk wawasan lebih dalam, jelajahi dokumentasi resmi Java tentang try-with-resources.