Mengerti bahwa exception melompati sisa alur program belum lengkap tanpa kemampuan menahannya. Konstruksi try-catch adalah alat utama untuk itu: blok try menandai wilayah berisiko, dan blok catch menjadi pintu tempat exception mendarat alih-alih merambat terus ke atas. Pada Chapter ini kita pelajari bentuk dasarnya, memetakan alur lompatan yang terjadi di dalamnya, dan membaca informasi dari objek exception yang tertangkap.

Bentuk Dasar try-catch #

Blok try membungkus statement-statement yang berpotensi melempar exception. Jika exception benar-benar terjadi, JVM memeriksa tipe exception tersebut terhadap tipe yang dideklarasikan tiap blok catch; blok pertama yang tipenya cocok akan dijalankan. Mari mulai dari contoh paling sederhana — mengonversi teks menjadi bilangan:

java BentukDasar.java
public class BentukDasar {
    public static void main(String[] args) {
        String masukan = "abc";

        try {
            int nilai = Integer.parseInt(masukan);
            System.out.println("nilai: " + nilai);
        } catch (NumberFormatException e) {
            System.out.println("jenis : " + e.getClass().getSimpleName());
            System.out.println("pesan : " + e.getMessage());
        }

        System.out.println("program tetap berjalan sampai sini.");
    }
}

Output yang Dihasilkan:

text
jenis : NumberFormatException
pesan : For input string: "abc"
program tetap berjalan sampai sini.

Mari kita bedah program di atas baris per baris:

  1. Baris 5-7 (try { ... }): tiga statement di dalamnya berisiko. Integer.parseInt("abc") gagal mengonversi teks menjadi bilangan, sehingga JVM melempar NumberFormatException.
  2. Baris 7 (} catch (NumberFormatException e) {): tipe di dalam kurung — NumberFormatException — dicocokkan dengan exception yang sedang terbang. Cocok, sehingga blok ini yang dijalankan. Variabel e menampung objek exception tersebut.
  3. Baris 8-9 (e.getClass()... dan e.getMessage()): membaca identitas dan pesan dari objek exception. getClass().getSimpleName() menghasilkan NumberFormatException, getMessage() menghasilkan teks For input string: "abc".
  4. Baris 12 (System.out.println("program tetap...")): karena exception sudah tertangkap, eksekusi berlanjut normal ke baris setelah blok catch — program tidak berhenti.

Blok try boleh berisi statement mana pun, termasuk pemanggilan method berlapis; exception yang muncul dari dalam method mana pun di dalam blok tersebut tetap menuju catch yang sama. Satu hal yang perlu diingat: hanya exception bertipe NumberFormatException atau turunannya yang tertangkap oleh catch ini — exception bertipe lain terus merambat keluar dari main.

Alur Lompatan Saat Exception Terjadi #

Saat exception dilempar di tengah blok try, sisa statement setelah titik kejadian tidak dieksekusi — JVM langsung melompat ke blok catch yang cocok. Setelah blok catch selesai, eksekusi lanjut ke statement pertama setelah keseluruhan konstruksi try-catch, bukan kembali ke titik kejadian. Program berikut menandai setiap tahap dengan nomor urut:

public class AlurLompatan {
    public static void main(String[] args) {
        System.out.println("1. sebelum blok try");

        try {
            System.out.println("2. awal blok try");
            int nilai = Integer.parseInt("abc"); // titik kegagalan
            System.out.println("3. baris ini terlewati");
        } catch (NumberFormatException e) {
            System.out.println("4. blok catch berjalan");
        }

        System.out.println("5. setelah blok try-catch");
    }
}

Output yang Dihasilkan:

text
1. sebelum blok try
2. awal blok try
4. blok catch berjalan
5. setelah blok try-catch

Urutan keluaran adalah 1, 2, 4, 5 — nomor 3 tidak pernah tercetak. Nomor tersebut berada setelah titik kegagalan di baris Integer.parseInt("abc"), dan lompatan ke catch membuat statement tersebut terlewati begitu saja. Sebaliknya, nomor 5 tetap berjalan karena penangkapan exception menuntaskan masalah tersebut pada level ini.

Sebagai pembanding, mari kita lihat program yang sama tanpa penangkap. Kali ini kegagalan berjalan sampai ke ujung main:

public class TanpaPenangkap {
    public static void main(String[] args) {
        System.out.println("sebelum kegagalan");
        int nilai = Integer.parseInt("abc");
        System.out.println("setelah kegagalan");
    }
}

Baris sebelum kegagalan sempat tercetak, lalu program berhenti dengan exit code 1. Default handler JVM melaporkan kegagalan tersebut di stderr dengan baris pembuka Exception in thread "main" java.lang.NumberFormatException: For input string: "abc", diikuti stack trace yang menunjuk Integer.parseInt sebagai sumber pelemparan dan TanpaPenangkap.main sebagai pemanggilnya. Statement setelah kegagalan tidak pernah dieksekusi — persis perilaku yang kita lihat pada Chapter Konsep Exception.

Membaca Objek Exception #

Objek exception yang tertangkap bukan sekadar penanda bahwa kegagalan terjadi; objek tersebut membawa data yang bisa kita baca. Tiga anggota yang paling sering dipakai:

  • getMessage() mengembalikan pesan detail sebagai String — teks yang sama yang tampil setelah nama exception pada stack trace. Beberapa exception dibuat tanpa pesan, sehingga method ini bisa mengembalikan null; gabungkan dengan nama tipe bila pesannya penting.
  • getClass().getSimpleName() mengembalikan nama class exception — cara ringkas untuk mencatat jenis kegagalan tanpa bergantung pada struktur blok catch.
  • toString() menggabungkan nama class lengkap dan pesannya, misalnya java.lang.NumberFormatException: For input string: "abc" — format yang sama dengan baris stack trace.

Kebutuhan berikutnya cepat terasa: satu blok try sering menghadapi lebih dari satu jenis kegagalan. Teks yang tidak bisa dikonversi dan berkas yang tidak bisa dibaca butuh tanggapan yang berbeda. Chapter Multiple catch menunjukkan cara menyusun beberapa blok catch berurutan dan sintaks multi-catch untuk menggabungkan beberapa tipe dalam satu blok.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

AlurLompatan.java

Unduh berkas
java
public class AlurLompatan {
    public static void main(String[] args) {
        System.out.println("1. sebelum blok try");

        try {
            System.out.println("2. awal blok try");
            int nilai = Integer.parseInt("abc"); // titik kegagalan
            System.out.println("3. baris ini terlewati");
        } catch (NumberFormatException e) {
            System.out.println("4. blok catch berjalan");
        }

        System.out.println("5. setelah blok try-catch");
    }
}

BentukDasar.java

Unduh berkas
java
public class BentukDasar {
    public static void main(String[] args) {
        String masukan = "abc";

        try {
            int nilai = Integer.parseInt(masukan);
            System.out.println("nilai: " + nilai);
        } catch (NumberFormatException e) {
            System.out.println("jenis : " + e.getClass().getSimpleName());
            System.out.println("pesan : " + e.getMessage());
        }

        System.out.println("program tetap berjalan sampai sini.");
    }
}

TanpaPenangkap.java

Unduh berkas
java
public class TanpaPenangkap {
    public static void main(String[] args) {
        System.out.println("sebelum kegagalan");
        int nilai = Integer.parseInt("abc");
        System.out.println("setelah kegagalan");
    }
}