ال الاحتجاج استثناء الهدف هو استثناء محدد يحتوي على استثناء تم طرحه بواسطة طريقة أو مُنشئ تم استدعاؤه. منذ JDK 1.4، تم تعديل هذا الاستثناء ليتوافق مع آلية تسلسل الاستثناءات للأغراض العامة. 'الاستثناء المستهدف' الذي تم توفيره في وقت الإنشاء والذي يمكن الوصول إليه عبر طريقة getTargetException() يُعرف الآن باسم السبب ويمكن الوصول إليه عبر طريقة Throwable.getCause()، بالإضافة إلى 'الطريقة القديمة'.
باختصار، عندما نقوم باستدعاء فصل دراسي باستخدام Method.invoc()، فإنه يطرح استثناءً؛ يتم تغليفه بواسطة java.lang.reflect.InvocationTargetException فصل.
سبب InvocationTargetException
يحدث InvokationTargetException بشكل أساسي أثناء العمل مع ملف جافا Reflection API وحاول استدعاء طريقة أو مُنشئ في طبقة الانعكاس التي تطرح استثناءً أساسيًا بنفسها.
تحتفظ طبقة الانعكاس بالاستثناء الفعلي الذي تم طرحه بواسطة الطرق الافتراضية.
كيفية حل مشكلة java.lang.reflect.InvocationTargetException
يحدث InvocationTargetException بسبب الطريقة التي تم استدعاؤها، والتي تطرح استثناءً. يمكن العثور على الاستثناء الأساسي باستخدام طريقة getCause(). لذلك، من الضروري العثور على الاستثناء الفعلي وحله لحل مشكلة InvocationTargetException.
خذ بعين الاعتبار المثال أدناه، الذي تم عن عمد إنشاء استثناء (القسمة على صفر) في الطريقة Demo()، والتي تم استدعاؤها باستخدام Method.invoc(). وبالتالي، فإن الإخراج سوف يطرح كلاً من AirthmeticException (DividebyZero) وInvokationTargetException.
TestInvocationException.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