ประเภทข้อยกเว้น

"วันนี้ฉันอยากจะพูดอีกเรื่องหนึ่ง ใน Java ข้อยกเว้นทั้งหมดจะแบ่งออกเป็นสองประเภท: ทำเครื่องหมายและไม่ได้ทำเครื่องหมาย (สิ่งที่ต้องตรวจจับได้ และสิ่งที่ไม่ต้องตรวจจับ) ตามค่าเริ่มต้นข้อยกเว้น ทั้งหมด ต้องเป็น จับได้."

"คุณจงใจโยนข้อยกเว้นในโค้ดของคุณได้ไหม"

"คุณสามารถโยนข้อยกเว้นใดๆ ลงในโค้ดของคุณเองได้ คุณยังสามารถเขียนข้อยกเว้นของคุณเองได้ แต่เราจะพูดถึงเรื่องนี้ในภายหลัง ตอนนี้ เรามาเน้นที่ข้อยกเว้นที่โยนโดย Java Machine"

"ตกลง."

"หากClassNotFoundExceptionหรือFileNotFoundExceptionถูกโยน (เกิดขึ้น) ในเมธอด ผู้พัฒนาต้องระบุในเมธอดการประกาศ สิ่งเหล่านี้คือ ข้อยกเว้นที่ มีการตรวจสอบนี่คือลักษณะที่ปรากฏ:"

ตัวอย่างของข้อยกเว้นที่ตรวจสอบ
public static void method1() throws ClassNotFoundException, FileNotFoundException
public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

"เราแค่เขียน 'throws' ตามด้วยรายการข้อยกเว้นที่คั่นด้วยเครื่องหมายจุลภาค ใช่ไหม"

"ใช่ แต่ยังมีอีกมาก เพื่อให้โปรแกรมคอมไพล์ เมธอดที่เรียกใช้method1ในตัวอย่างด้านล่างต้องทำอย่างใดอย่างหนึ่งจากสองสิ่งต่อไปนี้: จับข้อยกเว้นเหล่านี้หรือโยนใหม่ (ให้กับผู้เรียก)โดยระบุข้อยกเว้นที่เปลี่ยนใหม่ในการประกาศ "

"อีกครั้ง ถ้าเมธอดหลักของคุณต้องการเรียกเมธอดที่มีการประกาศว่า ' throws FileNotFoundException , …' คุณต้องทำอย่างใดอย่างหนึ่งต่อไปนี้:

1) จับ FileNotFoundException , …

คุณต้องห่อโค้ดที่เรียกใช้เมธอดที่ไม่ปลอดภัยในบล็อกtry-catch

2) อย่าจับ FileNotFoundException , …

คุณต้องเพิ่มข้อยกเว้นเหล่านี้ใน รายการ โยนของ วิธีการ หลัก ของคุณ "

"คุณช่วยยกตัวอย่างให้ฉันได้ไหม"

"ดูที่นี้:"

ตัวอย่างของข้อยกเว้นที่ตรวจสอบ
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");
}

"โค้ดในตัวอย่างนี้จะไม่คอมไพล์ เนื่องจาก เมธอด หลักเรียกใช้method1()ซึ่งจะโยนข้อยกเว้นที่ต้องตรวจจับ"

"ในการคอมไพล์ เราจำเป็นต้องเพิ่มการจัดการข้อยกเว้นให้กับเมธอดหลัก คุณสามารถทำได้ด้วยวิธีใดวิธีหนึ่งจากสองวิธี:"

ตัวเลือกที่ 1: เราเพียงแค่โยนข้อยกเว้นใหม่ (ให้กับผู้โทร):
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");
}

"และที่นี่เราจับมันด้วยการลองจับ :"

ตัวเลือกที่ 2: จับข้อยกเว้น:
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");
}

"เริ่มชัดเจนขึ้นแล้ว"

"ดูตัวอย่างต่อไปนี้ จะช่วยให้คุณเข้าใจส่วนที่เหลือ"

แทนที่จะจัดการข้อยกเว้น เราโยนมันใหม่เป็นเมธอดที่อยู่ลึกลงไปที่ call stack ซึ่งรู้วิธีจัดการกับมัน:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
จัดการข้อยกเว้นหนึ่งรายการแล้วโยนอีกรายการหนึ่ง:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
จับข้อยกเว้นทั้งสอง ไม่โยนเลย:
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.");
    }
}

"มีข้อยกเว้นอีกประเภทหนึ่งคือ RuntimeExceptionและคลาสที่สืบทอดมา คุณไม่จำเป็นต้องจับข้อยกเว้นเหล่านี้ สิ่งเหล่านี้เป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ พวกเขาถือว่าคาดเดาได้ยาก คุณสามารถจัดการกับพวกเขาในลักษณะเดียวกัน แต่คุณ ไม่จำเป็นต้องระบุไว้ใน ประโยค โยน "