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.

หากต้องการ คุณสามารถเรียกคืนจากที่นั่นได้อย่างง่ายดาย ตัวอย่าง:

รหัส บันทึก
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







รับข้อยกเว้นที่เก็บไว้ในRuntimeExceptionวัตถุ ตัวแปรcauseอาจจะnull

กำหนดประเภทของมันและแปลงเป็นประเภทข้อยกเว้น ที่ตรวจสอบ