Jenis pengecualian

"Saya ingin bercakap tentang satu perkara lagi hari ini. Di Jawa, semua pengecualian dibahagikan kepada dua jenis: ditanda dan tidak ditanda (yang mesti ditangkap dan yang anda tidak perlu tangkap). Secara lalai, semua pengecualian perlu ditangkap."

"Bolehkah anda dengan sengaja membuang pengecualian dalam kod anda?"

"Anda boleh membuang sebarang pengecualian dalam kod anda sendiri. Anda juga boleh menulis pengecualian anda sendiri. Tetapi kita akan membincangkannya kemudian. Sekarang, mari kita tumpukan perhatian pada pengecualian yang dilemparkan oleh Mesin Java."

"OKEY."

"Jika ClassNotFoundException atau FileNotFoundException dilemparkan (berlaku) dalam kaedah, pembangun mesti menunjukkannya dalam pengisytiharan kaedah. Ini adalah pengecualian yang diperiksa . Beginilah ia biasanya kelihatan:"

Contoh pengecualian yang disemak
public static void method1() throws ClassNotFoundException, FileNotFoundException

public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

"Jadi kita hanya menulis 'lontaran' diikuti dengan senarai pengecualian yang dibatasi koma, bukan?"

"Ya. Tetapi ada lagi. Untuk menyusun atur cara, kaedah yang memanggil method1dalam contoh di bawah mesti melakukan salah satu daripada dua perkara: sama ada menangkap pengecualian ini atau membuangnya semula (kepada pemanggil) , menunjukkan pengecualian yang dilemparkan semula dalam pengisytiharannya. "

"Sekali lagi. Jika kaedah utama anda perlu memanggil kaedah yang pengisytiharannya mengandungi ' throws FileNotFoundException , …', maka anda perlu melakukan salah satu daripada dua perkara:

1) Tangkap FileNotFoundException , …

Anda mesti membungkus kod yang memanggil kaedah tidak selamat dalam blok cuba-tangkap .

2) Jangan tangkap FileNotFoundException , …

Anda mesti menambah pengecualian ini pada senarai lontaran kaedah utama anda ."

"Bolehkah anda memberi saya contoh?"

"Lihat ini:"

Contoh pengecualian yang disemak
public static void main(String[] args)
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"Kod dalam contoh ini tidak akan disusun, kerana kaedah utama memanggil method1() , yang membuang pengecualian yang perlu ditangkap."

"Untuk menjadikannya menyusun, kita perlu menambah pengendalian pengecualian pada kaedah utama. Anda boleh melakukan ini dalam salah satu daripada dua cara:"

Pilihan 1: Kami hanya membuang semula pengecualian (kepada pemanggil):
public static void main(String[] args)  throws FileNotFoundException, ClassNotFoundException 
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"Dan di sini kita menangkapnya dengan cuba-tangkap :"

Pilihan 2: Tangkap pengecualian:
public static void main(String[] args)
{
    try
    {
        method1();
    }
    catch(Exception e)
    {
    }
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"Ia mula menjadi lebih jelas."

"Lihat contoh berikut. Ia akan membantu anda memahami selebihnya."

Daripada mengendalikan pengecualian, kami melemparkannya semula kepada kaedah yang lebih jauh ke bawah timbunan panggilan yang tahu cara mengendalikannya:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Kendalikan satu pengecualian dan buang yang lain:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Tangkap kedua-dua pengecualian, jangan buang:
public static void method4()
{
    try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
    catch (ClassNotFoundException e)
    {
        System.out.println("ClassNotFoundException has been caught.");
    }
}

"Terdapat satu lagi jenis pengecualian, RuntimeException dan kelas yang mewarisinya. Anda tidak perlu menangkapnya. Ini adalah pengecualian yang tidak disemak. Ia dianggap sukar untuk diramal. Anda boleh menanganinya dengan cara yang sama, tetapi anda tidak perlu menunjukkannya dalam klausa lontaran ."