3. การตัดคำยกเว้น
ข้อยกเว้น ที่ได้รับการตรวจสอบนั้นดูยอดเยี่ยมในทางทฤษฎี แต่กลายเป็นความยุ่งยากอย่างมากในทางปฏิบัติ
สมมติว่าคุณมีวิธียอดนิยมในโครงการของคุณ มันถูกเรียกจากหลายร้อยแห่งในโปรแกรมของคุณ และคุณตัดสินใจที่จะเพิ่ม ข้อยกเว้น ที่เลือกไว้ ใหม่ เข้าไป และอาจเป็นไปได้ว่า ข้อยกเว้น ที่ได้รับการตรวจสอบ นี้ มีความสำคัญมากและพิเศษมากจนมีเพียงmain()
เมธอดเท่านั้นที่รู้ว่าต้องทำอย่างไรหากถูกจับได้
ซึ่งหมายความว่าคุณจะต้องเพิ่มข้อยกเว้นที่เลือกไว้throws
ในส่วนคำสั่งของทุกวิธีที่เรียกใช้วิธีการยอดนิยมของคุณ รวมทั้งในthrows
อนุประโยคของเมธอดทั้งหลายที่เรียกเมธอดเหล่านั้น. และของเมธอดที่เรียกเมธอดเหล่านั้น
เป็นผลให้throws
ส่วนคำสั่งของครึ่งหนึ่งของวิธีการในโครงการได้รับข้อยกเว้นการตรวจสอบ ใหม่ และแน่นอนว่าโปรเจ็กต์ของคุณอยู่ภายใต้การทดสอบ และตอนนี้การทดสอบจะไม่คอมไพล์ และตอนนี้คุณต้องแก้ไขคำสั่งโยนในการทดสอบของคุณด้วย
จากนั้นรหัสทั้งหมดของคุณ (การเปลี่ยนแปลงทั้งหมดในไฟล์หลายร้อยไฟล์) จะต้องได้รับการตรวจสอบโดยโปรแกรมเมอร์รายอื่น และ ณ จุดนี้เราถามตัวเองว่าทำไมเราถึงทำการเปลี่ยนแปลงมากมายในโครงการ? วัน (s?) ของการทำงานและการทดสอบที่เสียหาย - ทั้งหมดนี้เพื่อเพิ่ม ข้อยกเว้น ที่ตรวจสอบหรือไม่?
และแน่นอนว่ายังคงมีปัญหาเกี่ยวกับการสืบทอดและวิธีการแทนที่ ปัญหาที่มาจาก ข้อยกเว้น ที่ตรวจสอบมีขนาดใหญ่กว่าผลประโยชน์ บรรทัดล่างคือตอนนี้มีเพียงไม่กี่คนที่รักพวกเขาและมีคนไม่กี่คนที่ใช้พวกเขา
อย่างไรก็ตาม ยังมีโค้ดจำนวนมาก (รวมถึงโค้ดไลบรารี Java มาตรฐาน) ที่มีข้อยกเว้นที่ตรวจสอบ เหล่านี้ จะทำอย่างไรกับพวกเขา? เราไม่สามารถเพิกเฉยต่อสิ่งเหล่านี้ได้ และเราไม่รู้ว่าจะจัดการกับมันอย่างไร
โปรแกรมเมอร์ Java เสนอให้ห่อ ข้อยกเว้น ที่ตรวจสอบแล้วในRuntimeException
. กล่าวอีกนัยหนึ่งคือ จับ ข้อยกเว้น ที่ตรวจสอบ ทั้งหมด แล้วสร้าง ข้อยกเว้น ที่ไม่ได้ตรวจสอบ (เช่นRuntimeException
) แล้วโยนทิ้งไปแทน การทำเช่นนั้นมีลักษณะดังนี้:
try
{
// Code where a checked exception might occur
}
catch(Exception exp)
{
throw new RuntimeException(exp);
}
มันไม่ใช่วิธีแก้ปัญหาที่สวยงามนัก แต่ที่นี่ไม่มีอาชญากร: ข้อยกเว้นถูกยัดไว้ในไฟล์RuntimeException
.
หากต้องการ คุณสามารถเรียกคืนจากที่นั่นได้อย่างง่ายดาย ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
รับข้อยกเว้นที่เก็บไว้ใน RuntimeException วัตถุ ตัวแปรcause อาจจะnull กำหนดประเภทของมันและแปลงเป็นประเภทข้อยกเว้น ที่ตรวจสอบ |