java.lang.reflect.InvocationTargetException คืออะไร

1. ภาพรวม

เมื่อทำงานร่วมกับ Java Reflection API มันเป็นเรื่องธรรมดาที่จะพบjava.lang.reflect.InvocationTargetException ในการกวดวิชานี้เราจะมาดูที่มันและวิธีการจัดการกับตัวอย่างง่ายๆ

2. สาเหตุของInvocationTargetException

ส่วนใหญ่เกิดขึ้นเมื่อเราทำงานกับเลเยอร์การสะท้อนและพยายามเรียกใช้เมธอดหรือตัวสร้างที่แสดงข้อยกเว้นที่อยู่ภายใต้ตัวมันเอง

ชั้นสะท้อน wraps ข้อยกเว้นที่เกิดขึ้นจริงโยนโดยวิธีการที่มี InvocationTargetException มาลองทำความเข้าใจกับตัวอย่าง

มาเขียนคลาสด้วยวิธีการที่จงใจโยนข้อยกเว้น:

public class InvocationTargetExample { public int divideByZeroExample() { return 1 / 0; } }

ตอนนี้ขอเรียกใช้วิธีการข้างต้นโดยใช้การสะท้อนในการทดสอบ JUnit 5 อย่างง่าย:

InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));

ในโค้ดด้านบนเราได้ยืนยันInvocationTargetExceptionซึ่งถูกโยนทิ้งขณะเรียกใช้เมธอด สิ่งสำคัญที่ควรทราบก็คือข้อยกเว้นที่แท้จริง - ArithmeticExceptionในกรณีนี้จะรวมอยู่ในInvocationTargetException

ตอนนี้คำถามที่อยู่ในใจคือทำไมการสะท้อนกลับไม่โยนข้อยกเว้นที่แท้จริงออกไปตั้งแต่แรก?

เหตุผลก็คือมันช่วยให้เราเข้าใจว่าExceptionเกิดขึ้นเนื่องจากความล้มเหลวในการเรียกใช้เมธอดผ่านชั้นการสะท้อนหรือเกิดขึ้นภายในเมธอดนั่นเอง

3. วิธีจัดการกับInvocationTargetException ?

ที่นี่ข้อยกเว้นที่แท้จริงคือสาเหตุของInvocationTargetExceptionดังนั้นเราจึงสามารถใช้Throwable.getCause ()เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

มาดูกันว่าเราสามารถใช้getCause ()เพื่อรับข้อยกเว้นจริงในตัวอย่างเดียวกับที่ใช้ด้านบน

assertEquals(ArithmeticException.class, exception.getCause().getClass());

ที่นี่เราใช้เมธอด getCause ()กับอ็อบเจ็กต์ข้อยกเว้นเดียวกันกับที่ถูกโยน และเราได้ยืนยันArithmeticException.classเป็นสาเหตุของข้อยกเว้น

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

4. สรุป

ในบทความสั้น ๆ นี้เราได้เห็นว่าชั้นการสะท้อนกลับห่อหุ้มข้อยกเว้นใด ๆ นอกจากนี้เรายังได้เห็นวิธีการระบุสาเหตุพื้นฐานของInvocationTargetExceptionและวิธีจัดการสถานการณ์ดังกล่าวด้วยตัวอย่างง่ายๆ

ตามปกติรหัสที่ใช้ในบทความนี้สามารถใช้ได้บน GitHub