Jenis pengecualian

"Saya ingin membicarakan satu hal lagi hari ini. Di Java, semua pengecualian dibagi menjadi dua jenis: dicentang dan tidak dicentang (yang harus ditangkap dan yang tidak harus Anda tangkap). Secara default, semua pengecualian harus tertangkap."

"Bisakah Anda dengan sengaja memasukkan pengecualian ke dalam kode Anda?"

"Anda dapat memasukkan pengecualian apa pun ke dalam kode Anda sendiri. Anda bahkan dapat menulis pengecualian Anda sendiri. Tapi kita akan membicarakannya nanti. Sekarang, mari berkonsentrasi pada pengecualian yang dilemparkan oleh Mesin Java."

"OKE."

"Jika ClassNotFoundException atau FileNotFoundException dilempar (terjadi) dalam suatu metode, pengembang harus menunjukkannya dalam deklarasi metode. Ini adalah pengecualian yang dicentang . Begini biasanya tampilannya:"

Contoh pengecualian diperiksa
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 'lemparan' diikuti dengan daftar pengecualian yang dibatasi koma, kan?"

"Ya. Tapi masih ada lagi. Agar program dapat dikompilasi, metode yang memanggil method1dalam contoh di bawah ini harus melakukan salah satu dari dua hal: menangkap pengecualian ini atau mengembalikannya (ke pemanggil) , menunjukkan pengecualian yang dilemparkan kembali dalam deklarasinya. "

"Lagi. Jika metode utama Anda perlu memanggil metode yang deklarasinya berisi ' throws FileNotFoundException , …', maka Anda perlu melakukan salah satu dari dua hal berikut:

1) Tangkap FileNotFoundException , …

Anda harus membungkus kode yang memanggil metode tidak aman dalam blok try-catch .

2) Jangan tangkap FileNotFoundException , …

Anda harus menambahkan pengecualian ini ke daftar lemparan metode utama Anda ."

"Bisakah Anda memberi saya contoh?"

"Lihatlah ini:"

Contoh pengecualian diperiksa
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");
}

"Kode dalam contoh ini tidak dapat dikompilasi, karena metode main memanggil method1() , yang melontarkan pengecualian yang harus ditangkap."

"Untuk membuatnya dikompilasi, kita perlu menambahkan penanganan pengecualian ke metode utama. Anda dapat melakukannya dengan salah satu dari dua cara:"

Opsi 1: Kami hanya mengembalikan pengecualian (ke 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 try-catch :"

Opsi 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");
}

"Ini mulai menjadi lebih jelas."

"Lihatlah contoh berikut. Ini akan membantu Anda memahami sisanya."

Alih-alih menangani pengecualian, kami melemparkannya kembali ke metode yang lebih jauh di tumpukan panggilan yang tahu cara menanganinya:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Tangani satu pengecualian dan lempar yang lain:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Tangkap kedua 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.");
    }
}
3
Tugas
Java Syntax,  level 9pelajaran 4
Terkunci
Code entry
Your attention, please! Now recruiting code entry personnel for CodeGym. So turn up your focus, let your fingers relax, read the code, and then... type it into the appropriate box. Code entry is far from a useless exercise, though it might seem so at first glance: it allows a beginner to get used to and remember syntax (modern IDEs seldom make this possible).

"Ada satu lagi jenis pengecualian, RuntimeException dan kelas yang mewarisinya. Anda tidak perlu menangkapnya. Ini adalah pengecualian yang tidak dicentang. Mereka dianggap sulit untuk diprediksi. Anda dapat menghadapinya dengan cara yang sama, tetapi Anda tidak perlu menunjukkannya dalam klausa melempar ."