วิธีการทำงานของ multi-catch - 1

"บทเรียนที่น่าสนใจอีกสองสามบท โอ้ฉันรักการสอน!"

"ฉันอยากจะบอกคุณเกี่ยวกับวิธี การทำงานของ catch block หลายอัน มันง่ายมาก: เมื่อมีข้อยกเว้นเกิดขึ้นในtry block การดำเนินการจะย้ายไปยัง catch block แรก"

"หากประเภทที่ระบุในวงเล็บของ catch block ตรงกับประเภทของข้อยกเว้นที่ถูกโยน การดำเนินการจะเริ่มขึ้นภายในบล็อกนั้น มิฉะนั้น เราจะย้ายไปยังcatch block ถัดไป ซึ่งจะทำการตรวจสอบแบบเดียวกัน"

"หากเราใช้ catch block หมดและข้อยกเว้นไม่ถูกจับ มันจะถูกโยนใหม่ และวิธีการปัจจุบันจะยุติอย่างผิดปกติ"

"ฉันเข้าใจแล้ว catch block ที่ตรงกับประเภทข้อยกเว้นจะถูกดำเนินการ"

"ใช่ ใช่ อย่างไรก็ตาม ในความเป็นจริงมันซับซ้อนกว่าเล็กน้อย คลาสสามารถสืบทอดคลาสอื่นๆ ได้ ถ้าคลาส Cow สืบทอดคลาส Animal วัตถุ Cow อาจถูกอ้างอิงไม่เพียงแค่โดยตัวแปร Cow เท่านั้น แต่ยังรวมถึงตัวแปร Animal ด้วย "

"และ?"

"เนื่องจากข้อยกเว้นทั้งหมดสืบทอดข้อยกเว้นหรือRuntimeException (ซึ่งสืบทอดข้อยกเว้น ด้วย ) พวกเขายังสามารถจับได้โดยใช้ 'จับ ( ข้อยกเว้น e)' หรือ ' จับ (RuntimeException e) '"

"และ?"

"เราสามารถสรุปได้สองข้อข้อแรก คุณสามารถใช้ 'catch (Exception e)' เพื่อจับข้อยกเว้น ข้อสอง ลำดับของ catch Blocks มีความสำคัญ "

"นี่คือตัวอย่างบางส่วน:"

"สิ่งArithmeticExceptionที่เกิดขึ้นหลังจากที่เราหารด้วย 0 จะถูกจับในบล็อก catch ที่สอง"

รหัส
try
{
    System.out.println("Before calling method1.");
    int a = 1 / 0;
    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.");
}

"ในตัวอย่างด้านล่างArithmeticExceptionจะถูกจับใน catch block แรก เนื่องจากข้อยกเว้นทั้งหมดสืบทอดข้อยกเว้น กล่าวคือExceptionครอบคลุมข้อยกเว้นทั้งหมด "

รหัส
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (Exception e)
{
    System.out.println("Any other errors. Exception has been caught.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
    System.out.println("Divided by zero. Exception has been caught.");
}

"ในตัวอย่างด้านล่างArithmeticExceptionจะไม่ถูกจับ มันจะเปลี่ยนวิธีการเรียกใหม่"

รหัส
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}

"นั่นทำให้สิ่งต่าง ๆ กระจ่างขึ้นเล็กน้อย ข้อยกเว้นเหล่านี้ไม่ใช่หัวข้อที่ง่ายที่สุด"

"ดูเหมือนเป็นอย่างนั้นจริงๆ พวกมันเป็นหนึ่งในสิ่งที่ง่ายที่สุดใน Java"

“ไม่รู้จะดีใจหรือเสียใจกับเรื่องนั้นดี...”