(i) ลำดับชั้นของ Java
เพื่อให้เข้าใจถึงความแตกต่างระหว่างข้อยกเว้นที่ตรวจสอบและข้อยกเว้นที่ไม่ได้ตรวจสอบใน Java ก่อนอื่นมาดูลำดับชั้นยกเว้นของ Java
นี่คือแผนภาพลำดับชั้นของ Java Exception ที่เรียบง่าย ควรสังเกตว่าคลาสทั้งหมดได้รับการสืบทอดมาจากการโยนได้และชั้นถัดไปจะแบ่งออกเป็นสองโครงสร้างข้อผิดพลาดและข้อยกเว้น ระดับคลาสข้อผิดพลาดอธิบายข้อผิดพลาดภายในและข้อผิดพลาดของการอ่อนเพลียของทรัพยากรในระบบรันไทม์ Java นอกเหนือจากการรายงานข้อผิดพลาดนี้ให้กับผู้ใช้และพยายามป้องกันไม่ให้โปรแกรมถูกยกเลิกอย่างปลอดภัยโดยทั่วไปมีวิธีแก้ปัญหาอื่น ๆ
(ii) ความแตกต่างระหว่างข้อยกเว้นที่ไม่ได้ตรวจสอบและข้อยกเว้นตรวจสอบ
หลังจากทำความเข้าใจกับข้างต้นลองมาดูสิ่งที่ตรวจสอบข้อยกเว้นและข้อยกเว้นที่ไม่ถูกตรวจสอบคืออะไร ในความเป็นจริงข้อกำหนดภาษา Java กำหนดทั้งสองนี้ง่ายมาก ข้อยกเว้นที่ได้มาจากข้อผิดพลาดหรือ RuntimeException เรียกว่าข้อยกเว้นที่ไม่ได้ตรวจสอบและข้อยกเว้นอื่น ๆ ทั้งหมดกลายเป็นข้อยกเว้นที่ตรวจสอบ แม้ว่าคำจำกัดความนี้จะง่ายมาก RuntimeException เป็นแนวคิดที่สับสนมาก ดูเหมือนว่าข้อยกเว้นทั้งหมดของเราอยู่ในขั้นตอนการรันโปรแกรม คำอธิบายของฉันเกี่ยวกับ ru ntimeException ใน Java ที่มีประสิทธิภาพนั้นไม่เป็นที่น่าพอใจ
ใช้ข้อยกเว้นที่ตรวจสอบแล้วสำหรับเงื่อนไขที่กู้คืนได้และข้อยกเว้นรันไทม์สำหรับข้อผิดพลาดในการเขียนโปรแกรม (รายการ 58 ในรุ่นที่ 2)
อย่างไรก็ตามจากประโยคนี้เราสามารถขยายได้นั่นคือ ถ้ามีการรับรู้ RuntimeException มันจะต้องเป็นปัญหาสำหรับโปรแกรมเมอร์เอง ตัวอย่างเช่นตัวห้อยอาร์เรย์อยู่นอกขอบเขตและการเข้าถึงข้อยกเว้นตัวชี้ว่าง ฯลฯ ตราบใดที่คุณให้ความสนใจเล็กน้อยข้อยกเว้นเหล่านี้เป็นข้อยกเว้นที่สามารถหลีกเลี่ยงได้ในขั้นตอนการเข้ารหัส หากคุณยังคิดว่าแนวคิดทั้งสองนี้ยากที่จะแยกแยะความแตกต่างดังนั้นวิธีการ "รุนแรงที่สุด" คือการจดจำ RuntimeException ทั่วไปซึ่งสามารถประหยัดเวลาได้มากในการตัดสิน
(iii) ทำไมเราควรแยกความแตกต่างระหว่างข้อยกเว้นที่ไม่ได้ตรวจสอบและตรวจสอบข้อยกเว้น?
เหตุผลนั้นง่ายมาก คอมไพเลอร์จะตรวจสอบว่าคุณมีกลไกการจัดการข้อยกเว้นสำหรับข้อยกเว้นที่ตรวจสอบทั้งหมดหรือไม่ ตัวอย่างเช่นเมื่อเราใช้ class.forName () เพื่อค้นหาวัตถุคลาสของสตริงที่กำหนดหากการจัดการข้อยกเว้นไม่ได้ให้ไว้สำหรับวิธีนี้การรวบรวมจะไม่ถูกส่งผ่าน
(iv) เราควรประกาศข้อยกเว้นอะไรบ้าง?
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ RuntimeException เป็นข้อผิดพลาดที่สามารถหลีกเลี่ยงได้ในระหว่างกระบวนการเขียนโปรแกรม ดังนั้นเราไม่จำเป็นต้องโยนข้อยกเว้นเหล่านี้หรือไม่? โดยหลักการแล้วนี่เป็นเรื่องจริง แต่ข้อกำหนด Java ไม่ได้ จำกัด สิ่งนี้ ดูเหมือนว่าคุณจะโยนอาร์เรย์ออกไปจากขอบเขตและไม่มีความสำคัญในทางปฏิบัติและในทางกลับกันมันจะทำให้เกิดการสูญเสียประสิทธิภาพบางอย่าง แล้วเราควรออกแบบข้อยกเว้นอย่างไร? เราต้องจำไว้ว่าสองสถานการณ์ต่อไปนี้จำเป็นต้องประกาศโยนข้อยกเว้น:
เรียกวิธีการตรวจสอบข้อยกเว้นเช่น IOException ด้วยเหตุผลเราได้พูดคุยกันก่อนหน้านี้หากมีการโยนข้อยกเว้นทั้งหมดที่ตรวจสอบแล้วมันก็ไม่สามารถรวบรวมได้ พบข้อผิดพลาดในระหว่างการทำงานของโปรแกรมและมีข้อยกเว้นถูกโยนลงโดยใช้คำสั่งโยน สำหรับข้อยกเว้นที่ไม่ได้ตรวจสอบมีเพียงสองสถานการณ์หลัก: หลีกเลี่ยงได้ (ข้อยกเว้นรันไทม์) หรือไม่สามารถควบคุมได้ สิ่งเหล่านี้ยังต้องมีการประกาศข้อยกเว้น
นี่คือตัวอย่างเพื่อแสดงให้เห็นถึงสิ่งที่น่าอึดอัดใจที่กล่าวถึงในหมายเหตุ 2 ด้านบน:
ขั้นแรกให้กำหนดคลาสข้อยกเว้นพื้นฐาน GenericeXception ที่สืบทอดมาจากข้อยกเว้น
แพ็คเกจ check_unchecked_exceptions; Public Class GenericeXception ขยายข้อยกเว้น { / ** * * / ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 2778045265121433720L; Public GenericeXception () {} Public GenericeXception (String msg) {super (msg); - ต่อไปนี้กำหนด VerifyException คลาสทดสอบ
แพ็คเกจ check_unchecked_exceptions; VerifyException ระดับสาธารณะ {โมฆะสาธารณะก่อน () พ่น Genericexception {โยน GenericeXception ใหม่ ("ตรวจสอบข้อยกเว้น"); } โมฆะสาธารณะที่สอง (สตริงผงชูรส) {ถ้า (msg == null) {โยน nullpointerexception ใหม่ ("ข้อยกเว้นที่ไม่ได้ตรวจสอบ"); }} โมฆะสาธารณะที่สาม () พ่น Genericexception {First (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {VerifyException ve = ใหม่ VerifyException (); ลอง {ve.first (); } catch (genericexception e) {e.printstacktrace (); } ve.second (null); -หลังจากทำงานให้รับข้อมูลต่อไปนี้เกี่ยวกับคอนโซลของ Eclipse:
check_unchecked_exceptions.genericexception: ตรวจสอบข้อยกเว้น
ที่ check_unchecked_exceptions.verifyexception.first (verifyexception.java:6)
ที่ check_unchecked_exceptions.verifyexception.main (verifyexception.java:23)
ข้อยกเว้นในเธรด "Main Main" java.lang.nullpointerexception: ข้อยกเว้นที่ไม่ได้ตรวจสอบ
ที่ check_unchecked_exceptions.verifyexception.second (verifyexception.java:11)
ที่ check_unchecked_exceptions.verifyexception.main (verifyexception.java:29)
ในตัวอย่างข้างต้นรวมกับแนวคิดของการตรวจสอบและไม่ได้ตรวจสอบจะเห็นได้ว่าข้อยกเว้นคลาสแม่เป็นประเภทตรวจสอบ แต่ subclass runtimeException (subclass nullpointerexception) ไม่ได้รับการตรวจสอบ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น