"Hai, Amigo. Kami akan mendapat pelajaran yang sangat menarik hari ini. Saya akan memberitahu anda tentang pengecualian. Pengecualian ialah mekanisme khas yang membolehkan kami mengendalikan ralat dalam program. Berikut ialah beberapa contoh ralat yang mungkin berlaku dalam program:

1. Program ini mungkin cuba menulis fail apabila cakera keras penuh sepenuhnya.

2. Program ini mungkin cuba memanggil kaedah pada pembolehubah yang menyimpan rujukan nol.

3. Program ini mungkin cuba membahagikan nombor dengan 0."

Semua tindakan ini mengakibatkan kesilapan. Biasanya, hasilnya ialah program ditamatkan serta-merta, kerana tidak masuk akal untuk terus melaksanakan kod dalam kes ini.

"Kenapa?"

"Adakah masuk akal untuk terus memusing roda jika kereta itu terkeluar dari jalan dan jatuh dari tebing?"

"Sekiranya program itu berhenti berjalan, kemudian?"

"Ya. Sekurang-kurangnya, inilah yang pernah berlaku. Sebarang ralat menyebabkan program ditamatkan."

"Itu pendekatan yang sangat bijak."

"Tetapi bukankah lebih baik untuk mencuba dan terus menjalankan program ini?"

"Ya. Katakan anda menaip sejumlah besar teks dalam Word dan menyimpannya. Bagaimana jika operasi simpan gagal, tetapi program ini membawa anda untuk percaya bahawa semuanya baik-baik saja? Dan anda terus menaip. Itu akan menjadi bodoh, bukan? ia?"

"Ya."

"Kemudian pengaturcara menghasilkan penyelesaian yang menarik: setiap fungsi akan mengembalikan status kerjanya. 0 bermakna ia berfungsi seperti yang diharapkan. Mana-mana nilai lain bermakna bahawa beberapa ralat berlaku dan nilai pulangan ialah kod ralat."

"Walau bagaimanapun, pendekatan itu juga mempunyai kekurangannya. Selepas setiap panggilan fungsi (!), anda perlu menyemak kod pemulangan (nombor). Pertama sekali, ini menyusahkan: kod pengendalian ralat jarang dilaksanakan tetapi perlu disertakan di mana-mana. Kedua, fungsi sering mengembalikan nilai yang berbeza – apakah yang anda patut lakukan dengannya?"

"Betul. Saya pun terfikir tentang itu."

"Kemudian, masa depan yang cerah tiba dalam bentuk pengecualian dan mekanisme pengendalian ralat. Begini cara ia berfungsi:

1. Apabila ralat berlaku, Mesin Java mencipta objek khas - pengecualian - di mana ia menyimpan semua maklumat ralat. Terdapat pengecualian yang berbeza untuk ralat yang berbeza.

2. Pengecualian menyebabkan atur cara segera keluar dari fungsi semasa, dan fungsi seterusnya, dan seterusnya – sehingga ia keluar dari kaedah utama. Kemudian program ditamatkan. Pengaturcara juga mungkin mengatakan bahawa Mesin Java 'membubarkan timbunan panggilan'."

"Tetapi anda berkata bahawa program itu tidak selalu ditamatkan."

"Ya, kerana ada cara untuk menangkap pengecualian. Kami boleh menulis kod khas di tempat yang betul untuk menangkap pengecualian yang kami ambil berat dan melakukan sesuatu dengan mereka. Ini perkara penting."

"Untuk membantu kami melakukan ini, terdapat binaan cuba-tangkap khas . Begini cara ia berfungsi:"

Contoh program yang menangkap pengecualian (bahagi dengan 0) dan terus berfungsi.
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);
    }
}
Output skrin:

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

"Tetapi mengapa 'Selepas memanggil kaedah1. Ini tidak akan ditunjukkan' dipaparkan pada skrin?"

"Saya gembira anda bertanya. Dalam baris 25, kami bahagikan dengan 0, yang membawa kepada ralat – pengecualian. Mesin Java mencipta objek ArithmeticException dengan maklumat tentang ralat. Objek adalah pengecualian."

"Pengecualian berlaku di dalam method1kaedah. Ini menyebabkan kaedah ditamatkan serta-merta. Ia akan menyebabkan kaedah utama ditamatkan jika bukan kerana blok cuba-tangkap ."

"Jika pengecualian berlaku di dalam blok percubaan , ia ditangkap dalam blok tangkapan . Baki kod dalam blok percubaan tidak akan dilaksanakan. Sebaliknya, blok tangkapan akan mula dilaksanakan. "

"Saya tidak faham."

"Dengan kata lain, kod berfungsi seperti ini:

1. Jika pengecualian berlaku di dalam blok cuba , kod akan berhenti dilaksanakan di mana pengecualian berlaku dan blok tangkapan mula dilaksanakan.

2. Jika tiada pengecualian berlaku, maka blok cuba dilaksanakan hingga akhir , dan blok tangkapan tidak dilaksanakan. "

"Hah?"

"Bayangkan selepas setiap panggilan kaedah kami menyemak sama ada kaedah itu kembali normal atau ditamatkan secara tiba-tiba akibat pengecualian. Jika terdapat pengecualian, maka kami bergerak untuk melaksanakan blok tangkapan (jika ada) untuk menangkap pengecualian. Jika tiada blok tangkapan, maka kami menamatkan kaedah semasa, dan kaedah yang memanggil kami melakukan pemeriksaan yang sama."

"Saya rasa saya sudah mendapatnya sekarang."

"Cemerlang."

"Apakah maksud 'Pengecualian' di dalam kenyataan tangkapan?"

" Semua pengecualian ialah kelas yang mewarisi kelas Pengecualian. Kami boleh menangkap pengecualian tertentu dengan menentukan kelas pengecualian dalam blok tangkapan , atau kami boleh menangkap semua pengecualian dengan menyatakan kelas induk biasa mereka – Pengecualian. Kemudian kami boleh mendapatkan semua ralat yang diperlukan maklumat daripada pembolehubah e (ia menyimpan rujukan kepada objek pengecualian)."

"Sejuk! Jika pengecualian berbeza berlaku dalam kaedah saya, bolehkah saya memprosesnya secara berbeza?"

"Bukan sahaja anda boleh, tetapi anda sepatutnya. Anda boleh 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 cuba boleh dipasangkan dengan beberapa blok tangkapan , setiap satunya akan menangkap jenis pengecualian yang ditentukan."

"Saya rasa saya faham. Saya belum boleh menulis ini sendiri, tetapi jika saya terjumpa dalam kod, saya tidak akan takut."