ข้อยกเว้นใน Java เกี่ยวข้องกับปัญหาของคลาส Parent-Child ซึ่งสามารถสรุปได้เป็นหนึ่งประโยค: ข้อยกเว้นที่ถูกโยนโดยตัวสร้างของคลาสย่อยจะต้องมีข้อยกเว้นของคลาสแม่ วิธีการของคลาสย่อยสามารถเลือกที่จะโยนข้อยกเว้นของคลาสแม่ "ขอบเขตน้อยกว่าหรือเท่ากับ" หรือไม่โยนข้อยกเว้น
1. ทำไมตัวสร้างต้องโยนข้อยกเว้นที่มีคลาสหลัก?
มีข้อความใน "สิ่งที่อยู่ใน Java":
ข้อ จำกัด ข้อยกเว้น: เมื่อเขียนทับเมธอดเฉพาะข้อยกเว้นเหล่านั้นที่ระบุไว้ในคำอธิบายข้อยกเว้นของวิธีการคลาสพื้นฐานเท่านั้นที่สามารถโยนได้
ข้อ จำกัด ข้อยกเว้นไม่ได้ผลสำหรับตัวสร้างคุณจะพบว่าตัวสร้างของ Stormyinning สามารถโยนข้อยกเว้นใด ๆ ได้โดยไม่ต้องใส่ใจกับข้อยกเว้นที่ถูกโยนลงโดยตัวสร้างคลาสพื้นฐาน อย่างไรก็ตามเนื่องจากตัวสร้างจะต้องถูกเรียกไม่ทางใดก็ทางหนึ่งคำอธิบายข้อยกเว้นของตัวสร้างคลาสย่อยจะต้องมีคำอธิบายข้อยกเว้นของตัวสร้างคลาสพื้นฐาน
ข้อความนี้ค่อนข้างสับสนในตอนแรก แต่คุณจะเข้าใจหลังจากอ่าน:
ก่อนอื่นคำอธิบายข้อยกเว้นมีไว้สำหรับวิธีการแทนที่เท่านั้นและตัวสร้างไม่ได้อยู่ในช่วงนี้ดังนั้นคอนสตรัคเตอร์ย่อยสามารถโยนข้อยกเว้นใด ๆ ได้โดยไม่คำนึงถึงข้อยกเว้นที่สร้างโดยตัวสร้างหลัก อย่างไรก็ตามเมื่อวัตถุย่อยใหม่ตัวสร้างคลาสแม่จะถูกเรียกอย่างแน่นอนดังนั้นข้อยกเว้นที่ถูกโยนโดยตัวสร้างคลาสแม่ที่สอดคล้องกันที่เรียกโดยตัวสร้างคลาสย่อยจะต้องนำมาพิจารณา ในเวลานี้เนื่องจาก "ตัวสร้างคลาสย่อยไม่สามารถจับข้อยกเว้นที่ถูกโยนโดยตัวสร้างคลาสแม่ (ซึ่งจะกล่าวถึงในภายหลัง)" ตัวสร้างคลาสย่อยจะต้องโยนข้อยกเว้นนี้
คลาส SomeException ขยายข้อยกเว้น {} คลาส TheOtherException ขยายข้อยกเว้น {} คลาส basec {public basec () โยน someException {} basec สาธารณะ (int a) โยน TheotherException {}} subc class ขยาย basec {public subc () // super (37) จะถูกโยน; // ถ้าคุณแทนที่ super () ด้วยสิ่งนี้ theotherexception จะต้องถูกโยน}}}2. เหตุใดคอนสตรัคคลาสย่อยไม่สามารถจับข้อยกเว้นที่ถูกโยนโดยตัวสร้างคลาสแม่ได้?
เพราะถ้าคลาสย่อยต้องการจับข้อยกเว้นที่ถูกโยนลงโดยคลาสแม่มันจะต้องแสดงการโทร super (); หรือ super (xxx ... ); อย่างไรก็ตาม super () และ this () มีคุณสมบัติซึ่งก็คือพวกเขาจะต้องอยู่ในบรรทัดแรกซึ่งขัดแย้งกับลอง {} catch {} ดังนั้นจึงไม่สามารถจับได้
3. เมื่อคลาสพาเรนต์และอินเทอร์เฟซที่สืบทอดโดยคลาสย่อยมีชื่อวิธีการเดียวกันวิธีการประมวลผลจะต้องปฏิบัติตามขีด จำกัด ข้อยกเว้น
Class SomeException ขยายข้อยกเว้น {} คลาส TheOtherException ขยายข้อยกเว้น {} อินเตอร์เฟสอินเตอร์เฟส {ฟังก์ชันโมฆะสาธารณะ () พ่น TheOtherException; } class basec {ฟังก์ชันโมฆะสาธารณะ () พ่น someexception {}} คลาส subc ขยาย basec onplements อินเตอร์เฟส {// ในเวลานี้คุณสามารถเลือกที่จะไม่โยนฟังก์ชันโมฆะสาธารณะ () {} // ข้อผิดพลาด // ข้อผิดพลาด: ข้อยกเว้น TheotherException ไม่สามารถใช้งานได้กับประโยคการโยนใน basec.function () // ฟังก์ชั่นโมฆะสาธารณะ () โยน TheotherException {}; -4. เหตุใด subclasses จึงโยนข้อยกเว้นเหล่านั้นที่แสดงไว้ในคำอธิบายข้อยกเว้นของวิธีการคลาสพื้นฐานเท่านั้น
เนื่องจาก subclass มีความเป็นไปได้ที่จะเปลี่ยนเป็นคลาสแม่ถ้า subclass ได้รับอนุญาตให้โยนข้อยกเว้นตามที่ต้องการเมื่อคลาสย่อยจะถูกแปลงเป็นคลาสพาเรนต์อินเทอร์เฟซของวิธีการ (เรียกมันว่ากรณี) จะกลายเป็นประเภทของคลาสแม่ ในเวลานี้ปัญหาคือ subclass จะโยนข้อยกเว้น แต่คลาสแม่ไม่สามารถจัดการกับข้อยกเว้นได้ ดังนั้นเพื่อให้แน่ใจว่าประเภทของวัตถุที่เปลี่ยนได้สามารถกำหนดได้ว่า "มีเพียงข้อยกเว้นเหล่านั้นที่แสดงไว้ในคำอธิบายข้อยกเว้นของวิธีการคลาสพื้นฐานจะถูกโยนลงไป"
"ข้อยกเว้น" ที่กล่าวถึงที่นี่ยังรวมถึงข้อยกเว้นของข้อยกเว้นเหล่านี้!
5. ฉันไม่รู้ว่าสิ่งนี้นับหรือไม่ บางทีฉันอาจจะค่อนข้างโง่ ฉันคิดถึงมันเป็นเวลานานก่อนที่ฉันจะเข้าใจ ตอนนี้มาเขียนกันเถอะ
คลาส SomeException ขยายข้อยกเว้น {} class basec {ฟังก์ชันโมฆะสาธารณะ () โยน someException {} // ถ้าข้อยกเว้นที่โยนที่นี่เป็น subclass ข้อยกเว้นรันไทม์มันไม่สามารถจัดการกับข้อยกเว้น} subc จะขยาย BASEC {<br> // super.function () การจัดการข้อยกเว้น! /* ฟังก์ชั่นโมฆะสาธารณะ () พ่น someException {super.function (); } */ ฟังก์ชันโมฆะสาธารณะ () {ลอง {super.function (); } catch (someException e) {e.printStackTrace (); -คำอธิบายโดยละเอียดข้างต้นเกี่ยวกับข้อยกเว้นที่เกี่ยวข้องกับชั้นเรียนของพ่อและเด็กโดยใช้ Java เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น