ทำความเข้าใจลำดับชั้นข้อยกเว้นใน Java อธิบาย

เผยแพร่แล้ว: 2022-03-08

เขาเรียกว่า 'ข้อยกเว้น' สั้นสำหรับ "เหตุการณ์พิเศษ" ใน Java ข้อยกเว้นคือเหตุการณ์ที่เกิดขึ้นระหว่างการทำงานของโปรแกรมและขัดขวางการไหลปกติของโปรแกรม ข้อยกเว้นเป็นสิ่งที่ไม่ต้องการและส่วนใหญ่ไม่คาดคิด ซึ่งโดยทั่วไปจะเกิดขึ้นที่เวลาทำงานหรือเวลาคอมไพล์ จำเป็นต้องจัดการข้อยกเว้นเหล่านี้ทั้งหมดเพื่อให้แน่ใจว่าโปรแกรมทำงานในโฟลว์ตามธรรมชาติ

อย่างไรก็ตาม ก่อนที่คุณจะจัดการกับข้อยกเว้น คุณควรรู้ว่ามีข้อยกเว้นประเภทใดบ้างใน Java ในบทความนี้ มาดูประเภทของ Exceptions ใน Java และ Exception Hierarchy ประเภทต่างๆ กัน

สารบัญ

ลำดับชั้นข้อยกเว้นใน Java

ลำดับชั้นของ Exceptions ในภาษาการเขียนโปรแกรม Java เริ่มต้นด้วยคลาส Throwable ซึ่งมาจากคลาส Object และเป็นคลาสย่อยโดยตรง ในขณะที่คลาส Exception นำเสนอคลาส Throwable ทั้งหมดนี้แยกย่อยออกเป็นสองคลาสย่อย - Error และ Exception นี่คือผังงานเพื่อทำความเข้าใจลำดับชั้นของ Java Exception ให้ดีขึ้น:

คลาส Exception แสดงข้อยกเว้นทั้งหมดที่คุณอาจต้องจัดการขณะทำงานกับภาษาการเขียนโปรแกรม Java ตัวอย่างที่ทราบและพบโดยทั่วไปของข้อยกเว้นดังกล่าว ได้แก่ NullPointerException, ClassNotFoundException, IllegalArgumentException เป็นต้น

ในทางกลับกัน คลาส Error จะดูแลปัญหาที่รุนแรงกว่าในสถาปัตยกรรมโปรแกรม Java ของคุณและไม่ได้รับการดูแลภายในโค้ดของแอปพลิเคชัน ตัวอย่างของข้อผิดพลาดใน Java ได้แก่ InternalError, AssertionError, OutOfMemoryError เป็นต้น

ข้อยกเว้นใน Java แบ่งออกเป็นสองประเภทเพิ่มเติม:

  • ตรวจสอบข้อยกเว้น - สิ่งเหล่านี้เรียกอีกอย่างว่าข้อยกเว้นเวลาคอมไพล์
  • ข้อยกเว้นที่ไม่ได้ตรวจสอบ – สิ่งเหล่านี้เรียกอีกอย่างว่าข้อยกเว้นรันไทม์

จุดสำคัญประการหนึ่งที่ควรทราบที่จุดเชื่อมต่อนี้คือ ข้อยกเว้นที่ไม่ได้เลือกคือคลาสย่อยทั้งหมดของคลาส RuntimeException เราจะพูดถึงข้อยกเว้นที่ตรวจสอบแล้วและไม่ได้ตรวจสอบเพิ่มเติมในบทความนี้ แต่ก่อนหน้านั้น เรามาดูกันว่าข้อผิดพลาดและข้อยกเว้นแตกต่างกันอย่างไรในการทำงานเพื่อไม่ให้เกิดความสับสน

ข้อผิดพลาดและข้อยกเว้นใน Java – แตกต่างกันอย่างไร

เอกสารอย่างเป็นทางการของภาษาการเขียนโปรแกรม Java หมายถึงข้อผิดพลาดที่เกิดขึ้นระหว่างการเขียนโปรแกรม Java ของคุณที่ – “ระบุปัญหาร้ายแรงที่แอปพลิเคชันที่เหมาะสมไม่ควรพยายามจับ” ความร้ายแรงของข้อผิดพลาดนั้นชัดเจนจากวิธีที่ข้อความนี้กำหนดไว้ เห็นได้ชัดว่า นี่หมายถึงชุดของปัญหาที่โปรแกรมของคุณอาจเผชิญซึ่งไม่สามารถกู้คืนได้หากไม่มีการปรับโครงสร้างโค้ดใหม่หรือแก้ไขสถาปัตยกรรมแอปพลิเคชัน Java

ลองดูวิธีการของ Java ที่จะเกิดข้อผิดพลาด:

พิมพ์โมฆะคงที่สาธารณะ (สตริง S) {

พิมพ์ (S);

}

ในโค้ดที่กล่าวข้างต้น เมธอด print() ทำหน้าที่เป็นเมธอดแบบเรียกซ้ำที่เรียกตัวเองซ้ำๆ ซ้ำแล้วซ้ำเล่า จนกว่าจะถึงขนาดสูงสุดที่อนุญาตสำหรับเธรดสแต็กใน Java ณ จุดนั้น มันจะออกจากการดำเนินการด้วยสิ่งที่พบได้บ่อยมาก – StackOverflowError ซึ่งอ่านได้ดังนี้:

ข้อยกเว้นในเธรด “main” java.lang.StackOverflowError

ที่ StackOverflowErrorExample.print (StackOverflowErrorExample.java:3)

ตามตัวอย่างข้างต้น วิธีการแสดงตัวอย่าง แต่ข้อผิดพลาดนี้ไม่สามารถจัดการได้ในโค้ดเอง ดังนั้น โปรแกรมเพียงแค่หยุดการทำงานเพราะความเสียหายนั้นไม่สามารถกู้คืนได้ เพื่อเป็นการแก้ปัญหา ต้องแก้ไขโค้ด

ตรงกันข้ามกับข้อผิดพลาด ข้อยกเว้น ระบุเงื่อนไขที่แอปพลิเคชันที่เหมาะสมสามารถตรวจจับได้ ข้อยกเว้นใน Java รวมถึงปัญหาที่อาจเกิดขึ้นในขณะคอมไพล์หรือระหว่างรันไทม์ ข้อยกเว้นเหล่านี้เกิดขึ้นค่อนข้างบ่อยในแอปพลิเคชันทั้งหมด โดยเฉพาะอย่างยิ่งในระหว่างขั้นตอนการทดสอบและการดีบัก เป็นผลให้สามารถจัดการข้อยกเว้นใน Java ภายในตัวโปรแกรมเพื่อให้แน่ใจว่าโค้ดรันโฟลว์ตามธรรมชาติ

ทีนี้ มาพูดถึง Exception Hierarchy ใน Java กันสักหน่อย โดยดูว่า Exceptions ที่ตรวจสอบแล้วและไม่ได้ตรวจสอบอะไร

ข้อยกเว้นที่ตรวจสอบแล้วและไม่ได้ตรวจสอบใน Java

ดังที่ได้กล่าวไว้ก่อนหน้านี้ ข้อยกเว้นในโปรแกรม Java สามารถเกิดขึ้นได้ระหว่างเวลาคอมไพล์หรือระหว่างรันไทม์ นี่คือสิ่งที่ทำให้เรามีข้อยกเว้นสองประเภทกว้างๆ ที่มีอยู่ใน Java นี่คือการดูรายละเอียดข้อยกเว้นทั้งสองนี้

ข้อยกเว้นเวลาคอมไพล์

ข้อยกเว้นที่เกิดขึ้นในเวลาคอมไพล์เรียกว่าข้อยกเว้นเวลาคอมไพล์ สิ่งเหล่านี้เรียกว่าการตรวจสอบข้อยกเว้นเนื่องจากคุณจำเป็นต้องตรวจสอบอย่างชัดเจนในโปรแกรม Java ของคุณและจัดการกับมันในโค้ดเอง คลาสเช่น InterruptedException, IOException และอื่นๆ จะถูกตรวจสอบข้อยกเว้น

ลองดูวิธีการที่สามารถจัดการกับข้อยกเว้นที่ตรวจสอบได้:

โมฆะสาธารณะ writeAFile () {

ลอง (BufferedWriter b_w = ใหม่ BufferedWriter (FileWriter ใหม่ (“myFile.txt”))) {

b_w.write("กำลังทดสอบ");

} จับ (IOException ioe) {

ioe.printStackTrace();

}

}

อย่างที่คุณเห็น มีสองคำสั่งในบล็อกการลองของโค้ดด้านบน –

  • การสร้างอินสแตนซ์ของวัตถุ – BufferedWriter
  • การใช้วัตถุเพื่อเขียนไปยังไฟล์

คำสั่งทั้งสองนี้สามารถโยน IOException IOException ซึ่งเป็น Checked Exception จะต้องได้รับการจัดการโดยผู้โทรหรือเมธอด ในตัวอย่างข้างต้น คุณจะเห็นว่ามีการจัดการข้อยกเว้นภายในเมธอดนั้นเอง

ข้อยกเว้นรันไทม์

ตรงกันข้ามกับข้อยกเว้นเวลาคอมไพล์ที่เกิดขึ้นระหว่างเวลาคอมไพล์ รันไทม์หรือข้อยกเว้นที่ไม่ได้ตรวจสอบสามารถโยนทิ้ง "เมื่อใดก็ได้" ซึ่งหมายถึงที่รันไทม์เป็นหลัก ด้วยเหตุนี้ เมธอดจึงไม่จำเป็นต้องใช้บล็อก catch-and-throw อย่างชัดเจนเพื่อจัดการกับข้อยกเว้นที่ไม่ได้ตรวจสอบเหล่านี้ คลาสบางคลาสที่สืบทอดข้อยกเว้นรันไทม์ที่ไม่ได้ตรวจสอบ ได้แก่ – NullPointerException, ArithmeticException เป็นต้น

ลองดูโค้ด Java ส่วนหนึ่งที่ส่ง NullPointerException ที่ไม่ได้เลือก Exception และไม่ได้รับการจัดการในส่วนของโค้ดที่ไม่เหมือนก่อนหน้านี้ นี่คือ:

โมฆะสาธารณะ writeToFile () {

ลอง (BufferedWriter b_w = null) {

b_w.write("ทดสอบ");

} จับ (IOException ioe) {

ioe.printStackTrace();

}

}

เมื่อคุณเรียกใช้เมธอดข้างต้น โปรแกรมจะส่ง NullPointerException เนื่องจากอ็อบเจ็กต์ BufferedWriter เป็นโมฆะ นี่คือสิ่งที่ข้อยกเว้นจะอ่านเช่น:

ข้อยกเว้นในเธรด “main” java.lang.NullPointerException

ที่ IOExceptionExample.writeToFile (IOExceptionExample.java:10)

ที่ IOExceptionExample.main (IOExceptionExample.java:17)

สรุปแล้ว

ด้วยเหตุนี้ เราจึงมาถึงจุดสิ้นสุดของบล็อกนี้เกี่ยวกับการทำความเข้าใจลำดับชั้นของข้อยกเว้นใน Java โปรดจำไว้ว่าสิ่งนี้ไม่ได้ครอบคลุมถึง Exceptions ใน Java อย่างครอบคลุม และวิธีจัดการกับมัน เพื่อสิ่งนี้ คุณควรเจาะลึกและเปิดเผยตัวเองถึงข้อยกเว้นที่เป็นไปได้ต่างๆ เพื่อดูว่ามันทำงานอย่างไร การรู้การจัดการข้อยกเว้นจะทำให้คุณมีอาชีพที่ประสบความสำเร็จในฐานะนักพัฒนาแบบฟูลสแตก เนื่องจากข้อยกเว้นเป็นพื้นฐานของแอปพลิเคชันใดๆ

ที่ upGrad เรามีหลักสูตรการพัฒนาแบบครบวงจรเฉพาะทาง – หลักสูตร Executive PG Program ในการพัฒนาซอฟต์แวร์ – ความเชี่ยวชาญพิเศษด้านการพัฒนา Full Stack – ที่ซึ่งเราจะนำคุณไปสู่ความแตกต่างของการพัฒนาซอฟต์แวร์โดยมุ่งเน้นที่การพัฒนา Full Stack เป็นหลัก เราขอแนะนำให้คุณตรวจสอบหลักสูตรและอาจจองที่นั่งเร็ว ๆ นี้!

1. คลาสใดอยู่ที่ด้านบนสุดของ Exception Hierarchy ใน Java?

คลาส Throwable อยู่ที่ด้านบนสุดของ Exception Hierarchy ใน Java

2. มีข้อยกเว้นประเภทใดบ้างใน Java

Java ไม่ได้เลือกและตรวจสอบข้อยกเว้น ข้อยกเว้นที่ตรวจสอบแล้วจะเรียกว่าข้อยกเว้นเวลาคอมไพล์ในขณะที่ข้อยกเว้นที่ไม่ได้ตรวจสอบนั้นเรียกว่าข้อยกเว้นรันไทม์

3. มีการจัดการข้อยกเว้นใน Java อย่างไร

try-catch เป็นวิธีที่ง่ายที่สุดในการจัดการข้อยกเว้นใน Java โค้ดหลักที่คุณต้องการเรียกใช้ต้องอยู่ในบล็อก try ขณะที่บล็อก catch อย่างน้อยหนึ่งบล็อกจะตรวจจับข้อยกเว้นทั้งหมดที่โค้ดส่งมา วิธีนี้จะตรวจจับข้อยกเว้น Java ประเภทใดก็ได้ที่ถูกส่งออกไป