logo

InvocationTargetException

ה InvocationTargetException הוא חריג מסומן שמחזיק חריג שנזרק על ידי שיטה או בנאי שהופעלו. מאז JDK 1.4, חריג זה עבר התאמה למנגנון שרשור חריגים למטרות כלליות. 'חריג היעד' שסופק בזמן הבנייה וגישה אליו באמצעות שיטת getTargetException() ידוע כעת כגורם וניתן לגשת אליו באמצעות שיטת Throwable.getCause() וכן 'שיטה מדור קודם'.

בקצרה, כאשר אנו מפעילים מחלקה באמצעות ה- Method.invoke(), הוא זורק חריג; הוא עטוף על ידי java.lang.reflect.InvocationTargetException מעמד.

הסיבה ל-InvokationTargetException

ה-InvokationTargetException מתרחש בעיקר בזמן עבודה עם Java Reflection API ונסה להפעיל שיטה או בנאי בשכבת ההשתקפות שזורק חריג בסיסי בעצמו.

שכבת ההשתקפות מכילה את החריגה בפועל שנזרקה על ידי שיטות ברירת המחדל.

כיצד לפתור את java.lang.reflect.InvocationTargetException

ה-InvocationTargetException נגרמת על ידי השיטה המופעלת, אשר זורקת חריג. ניתן למצוא את החריג הבסיסי באמצעות שיטת getCause() . לכן, יש צורך למצוא את החריג בפועל ולפתור אותו כדי לפתור את InvocationTargetException.

InvocationTargetException

שקול את הדוגמה שלהלן, אשר יוצרת חריג בכוונה (לחלק באפס) בשיטה Demo(), אשר מופעלת באמצעות ה- Method.invoke(). לפיכך, הפלט יזרוק גם את AirthmeticException (DividebyZero) וגם InvokationTargetException.

TestInvokationException.java:

 import java.lang.reflect.Method; public class TestInvocationException { public static void main(String[] args) { TargetInvocation ti = new TargetInvocation(); // Accessing all the methods of TargetInvocationClass: Method[] m = TargetInvocation.class.getMethods(); try { // Invoking the first method of the TargetInvocatioClass: m[0].invoke(ti); } catch(Exception e) { // Printing the wrapper exception: System.out.println('Wrapper exception: ' + e); // Printing the 'actual' exception: System.out.println('Underlying exception: ' + e.getCause()); } } } class TargetInvocation{ public void Demo() { // Dividing by zero to intentionally throw an exception: System.out.println(10 / 0); } } 

תְפוּקָה:

 Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero