InvocationTargetException হল একটি বিশেষ ধরনের checked exception যা Java রিফ্লেকশন ব্যবহারের সময় ঘটে, যখন একটি মেথড কল করা হয় এবং সেই মেথডের মধ্যে অন্য কোনো এক্সেপশন ঘটে। এই এক্সেপশনটি Method.invoke() মেথডের মাধ্যমে মেথড কল করার সময় উত্থিত হয়।
InvocationTargetException ব্যাখ্যা:
InvocationTargetException মূলত একটি wrapper exception। এটি মূলত অন্য কোনো এক্সেপশনকে লুকিয়ে রাখে, যা আসলে সেই মেথডের মধ্যে ঘটে। যখন Method.invoke() ব্যবহার করে কোনো মেথড কল করা হয় এবং ওই মেথডে একটি এক্সেপশন থ্রো করা হয়, তখন সেই এক্সেপশনটি InvocationTargetException এর মাধ্যমে র্যাপ হয়ে আমাদের কাছে আসে।
কিভাবে InvocationTargetException তৈরি হয়:
ধরা যাক, আপনি রিফ্লেকশন ব্যবহার করে একটি মেথড কল করছেন, এবং সেই মেথডের মধ্যে কোনো runtime exception ঘটে, যেমন NullPointerException বা ArithmeticException। এই ক্ষেত্রেও আপনি একটি InvocationTargetException পাবেন।
InvocationTargetException এর উদাহরণ:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
class MyClass {
public void myMethod() {
System.out.println("This is my method.");
}
public void myMethodWithException() throws Exception {
throw new Exception("An exception occurred inside the method.");
}
}
public class ReflectionExample {
public static void main(String[] args) {
try {
// MyClass ক্লাসের রিফ্লেকশন অবজেক্ট পেতে
Class<?> cls = MyClass.class;
// myMethod() মেথডের রিফ্লেকশন অবজেক্ট পেতে
Method method = cls.getMethod("myMethod");
// মেথড কল করা
method.invoke(new MyClass());
// myMethodWithException() মেথডের রিফ্লেকশন অবজেক্ট পেতে
Method methodWithException = cls.getMethod("myMethodWithException");
// মেথড কল করা, এটি একটি exception থ্রো করবে
methodWithException.invoke(new MyClass());
} catch (InvocationTargetException e) {
// InvocationTargetException এর ব্যবস্থাপনা
System.out.println("InvocationTargetException occurred: " + e.getCause());
e.getCause().printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
This is my method.
InvocationTargetException occurred: java.lang.Exception: An exception occurred inside the method.
at MyClass.myMethodWithException(MyClass.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at ReflectionExample.main(ReflectionExample.java:28)
কোড ব্যাখ্যা:
myMethodWithException(): এই মেথডে একটি সাধারণExceptionথ্রো করা হয়েছে।Method.invoke():myMethodWithException()কল করার সময়, যেহেতু এটি একটি এক্সেপশন থ্রো করবে, তাই এটিInvocationTargetExceptionদ্বারা র্যাপ করা হবে।InvocationTargetException: যখন মেথডের ভিতরে কোনো এক্সেপশন ঘটে, তখন তাInvocationTargetExceptionএ র্যাপ হয়। আপনি এই এক্সেপশনটি ধরতে পারেন এবং এর মাধ্যমে মূল এক্সেপশনটি (যাgetCause()এর মাধ্যমে পাওয়া যায়) বের করতে পারেন।
InvocationTargetException এর ব্যবস্থাপনা:
যেহেতু InvocationTargetException একটি checked exception এবং এটি Method.invoke() মেথডের মাধ্যমে ঘটে, তাই এর ব্যবস্থাপনা করতে হলে আপনি try-catch ব্লক ব্যবহার করবেন।
getCause():InvocationTargetExceptionএর মাধ্যমে আসা মূল এক্সেপশনটি পেতে আপনিgetCause()মেথড ব্যবহার করতে পারেন। এটি মূল এক্সেপশনটি ফেরত দেয়, যা মেথডের ভিতরে ঘটেছিল।
getMessage():- এক্সেপশনের মেসেজ পেতে
getMessage()মেথড ব্যবহার করতে পারেন।
- এক্সেপশনের মেসেজ পেতে
InvocationTargetException এর ব্যবস্থাপনা উদাহরণ:
ধরা যাক, আপনি একটি মেথড কল করছেন এবং সেই মেথডের মধ্যে একটি ArithmeticException ঘটছে। আপনি রিফ্লেকশন ব্যবহার করে এই এক্সেপশনটি ধরে ফেলতে পারেন।
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
class MathOperations {
public int divide(int a, int b) {
return a / b;
}
}
public class ReflectionExample {
public static void main(String[] args) {
try {
// MathOperations ক্লাসের রিফ্লেকশন অবজেক্ট পেতে
Class<?> cls = MathOperations.class;
// divide() মেথডের রিফ্লেকশন অবজেক্ট পেতে
Method method = cls.getMethod("divide", int.class, int.class);
// 0 দ্বারা ভাগ করার চেষ্টা, যা ArithmeticException থ্রো করবে
method.invoke(new MathOperations(), 10, 0);
} catch (InvocationTargetException e) {
// InvocationTargetException এর ব্যবস্থাপনা
System.out.println("InvocationTargetException occurred: " + e.getCause());
e.getCause().printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
InvocationTargetException occurred: java.lang.ArithmeticException: / by zero
at MathOperations.divide(MathOperations.java:5)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at ReflectionExample.main(ReflectionExample.java:24)
InvocationTargetException ব্যবস্থাপনা টিপস:
getCause()ব্যবহার করুন:InvocationTargetExceptionযখন থ্রো হয়, তখন মূল এক্সেপশনটি বের করার জন্যgetCause()ব্যবহার করুন। এটি আপনাকে মূল এক্সেপশনের অবস্থা বা মেসেজ জানতে সাহায্য করবে।
- Exception Chaining:
InvocationTargetExceptionএকটি exception chaining সাপোর্ট করে, যার মাধ্যমে আপনি আসল এক্সেপশনটি শনাক্ত করতে পারেন।
try-catchব্লক:InvocationTargetExceptionএর ব্যবস্থাপনার জন্য আপনার রিফ্লেকশন কোডকেtry-catchব্লকের মধ্যে রাখতে হবে এবং এক্সেপশন হ্যান্ডলিং করতে হবে।
InvocationTargetExceptionহল একটি wrapper exception যাMethod.invoke()মেথডের মাধ্যমে এক্সেপশন হ্যান্ডলিংয়ের সময় ঘটে।- এর মাধ্যমে মূল এক্সেপশনটি (যে এক্সেপশনটি আসলে মেথডের ভিতরে ঘটেছিল) অ্যাক্সেস করা সম্ভব।
getCause()মেথডটি ব্যবহার করে আপনি মূল এক্সেপশনের তথ্য পেতে পারেন এবং সেই এক্সেপশনটির যথাযথ ব্যবস্থাপনা করতে পারেন।
Read more