"Hai, Amigo. Kita akan mendapatkan pelajaran yang sangat menarik hari ini. Saya akan memberitahu Anda tentang pengecualian. Pengecualian adalah mekanisme khusus yang memungkinkan kita menangani kesalahan dalam program. Berikut adalah beberapa contoh kesalahan yang mungkin terjadi dalam sebuah program:

1. Program mungkin mencoba menulis file saat hard drive sudah penuh.

2. Program mungkin mencoba memanggil metode pada variabel yang menyimpan referensi nol.

3. Program mungkin mencoba membagi angka dengan 0."

Semua tindakan ini menghasilkan kesalahan. Biasanya hasilnya adalah program segera berhenti, karena tidak masuk akal untuk terus mengeksekusi kode dalam kasus ini.

"Mengapa?"

"Apakah masuk akal untuk terus memutar roda jika mobil keluar jalur dan jatuh dari tebing?"

"Kalau begitu, haruskah program berhenti berjalan?"

"Ya. Paling tidak, inilah yang dulu terjadi. Kesalahan apa pun menyebabkan program berhenti."

"Itu pendekatan yang sangat cerdas."

"Tapi bukankah lebih baik mencoba dan terus menjalankan programnya?"

"Ya. Misalkan Anda mengetik sejumlah besar teks di Word dan menyimpannya. Bagaimana jika operasi penyimpanan gagal, tetapi program membuat Anda percaya bahwa semuanya baik-baik saja? Dan Anda terus mengetik. Itu bodoh, bukan? dia?"

"Ya."

"Kemudian pemrogram datang dengan solusi yang menarik: setiap fungsi akan mengembalikan status pekerjaannya. 0 berarti berfungsi seperti yang diharapkan. Nilai lain apa pun berarti terjadi beberapa kesalahan, dan nilai yang dikembalikan adalah kode kesalahan."

"Namun, pendekatan itu juga memiliki kekurangan. Setelah setiap (!) pemanggilan fungsi, Anda harus memeriksa kembali kode (angka). Pertama-tama, ini merepotkan: kode penanganan kesalahan jarang dijalankan tetapi perlu disertakan di mana-mana. Kedua, fungsi seringkali mengembalikan nilai yang berbeda – apa yang harus Anda lakukan dengannya?"

"Benar. Aku juga memikirkannya."

"Kemudian, masa depan yang cerah tiba dalam bentuk pengecualian dan mekanisme penanganan kesalahan. Begini cara kerjanya:

1. Saat terjadi kesalahan, Mesin Java membuat objek khusus – pengecualian – yang menyimpan semua informasi kesalahan. Ada pengecualian yang berbeda untuk kesalahan yang berbeda.

2. Pengecualian menyebabkan program segera keluar dari fungsi saat ini, dan fungsi selanjutnya, dan seterusnya – hingga keluar dari metode utama. Kemudian program berakhir. Pemrogram juga dapat mengatakan bahwa Mesin Java 'melepas tumpukan panggilan'."

"Tapi kamu bilang programnya tidak selalu berhenti."

"Ya, karena ada cara untuk menangkap pengecualian. Kita dapat menulis kode khusus di tempat yang tepat untuk menangkap pengecualian yang kita minati dan melakukan sesuatu dengannya. Ini adalah hal yang penting."

"Untuk membantu kami melakukan ini, ada konstruksi try-catch khusus . Begini cara kerjanya:"

Contoh program yang menangkap pengecualian (dibagi dengan 0) dan terus bekerja.
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (Exception e)
        {
           System.out.println("Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}
Keluaran layar:

Program starts
Before method1 calling
Exception has been caught
Program is still running

"Tapi mengapa 'Setelah memanggil metode1. Ini tidak akan pernah ditampilkan' ditampilkan di layar?"

"Saya senang Anda bertanya. Pada baris 25, kita bagi dengan 0, yang mengarah ke kesalahan – pengecualian. Mesin Java membuat objek ArithmeticException dengan informasi tentang kesalahan. Objek tersebut adalah pengecualian."

"Pengecualian terjadi di dalam method1metode. Hal ini menyebabkan metode dihentikan dengan segera. Ini akan menyebabkan metode utama dihentikan jika bukan karena blok try-catch ."

"Jika pengecualian terjadi di dalam blok try , itu ditangkap di blok catch . Kode yang tersisa di blok try tidak akan dieksekusi. Sebaliknya, blok catch akan mulai dieksekusi. "

"Aku tidak mengerti."

"Dengan kata lain, kodenya berfungsi seperti ini:

1. Jika pengecualian terjadi di dalam blok try , kode berhenti dieksekusi di mana pengecualian terjadi dan blok catch mulai dieksekusi.

2. Jika tidak terjadi eksepsi, maka blok try dieksekusi sampai akhir , dan blok catch tidak dieksekusi. "

"Hah?"

"Bayangkan bahwa setelah setiap pemanggilan metode kita memeriksa apakah metode tersebut kembali secara normal atau tiba-tiba dihentikan sebagai akibat dari pengecualian. Jika ada pengecualian, maka kita bergerak untuk mengeksekusi blok catch (jika ada) untuk menangkap pengecualian tersebut. Jika tidak ada catch block, maka kita menghentikan metode saat ini, dan metode yang memanggil kita melakukan pemeriksaan yang sama."

"Kurasa aku sudah mendapatkannya sekarang."

"Bagus sekali."

"Apa arti 'Pengecualian' di dalam pernyataan catch?"

" Semua pengecualian adalah kelas yang mewarisi kelas Pengecualian. Kita dapat menangkap pengecualian tertentu dengan menentukan kelas pengecualian di blok tangkapan , atau kita dapat menangkap semua pengecualian dengan menentukan kelas induknya – Pengecualian. Kemudian kita bisa mendapatkan semua kesalahan yang diperlukan informasi dari variabel e (menyimpan referensi ke objek pengecualian)."

"Keren! Jika pengecualian berbeda muncul dalam metode saya, bisakah saya memprosesnya secara berbeda?"

"Kamu tidak hanya bisa, tapi kamu harus. Kamu bisa melakukannya seperti ini:"

Contoh:
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (NullPointerException e)
        {
           System.out.println("Null reference. Exception has been caught");
        }
        catch (ArithmeticException e)
        {
            System.out.println("Division by zero. Exception has been caught");
        }
        catch (Exception e)
        {
            System.out.println("Any other errors. Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}

" Blok try dapat dipasangkan dengan beberapa blok catch , yang masing-masing akan menangkap jenis pengecualian yang ditentukan."

"Kurasa aku mengerti. Aku belum bisa menulis ini sendiri, tapi jika aku menemukannya dalam bentuk kode, aku tidak akan takut."