InvocationTargetException এবং তার ব্যবস্থাপনা

Exception Handling এবং Reflection - জাভা রিফ্লেক্ট প্যাকেজ (Java.reflect Package) - Java Technologies

331

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)

কোড ব্যাখ্যা:

  1. myMethodWithException(): এই মেথডে একটি সাধারণ Exception থ্রো করা হয়েছে।
  2. Method.invoke(): myMethodWithException() কল করার সময়, যেহেতু এটি একটি এক্সেপশন থ্রো করবে, তাই এটি InvocationTargetException দ্বারা র‍্যাপ করা হবে।
  3. InvocationTargetException: যখন মেথডের ভিতরে কোনো এক্সেপশন ঘটে, তখন তা InvocationTargetException এ র‍্যাপ হয়। আপনি এই এক্সেপশনটি ধরতে পারেন এবং এর মাধ্যমে মূল এক্সেপশনটি (যা getCause() এর মাধ্যমে পাওয়া যায়) বের করতে পারেন।

InvocationTargetException এর ব্যবস্থাপনা:

যেহেতু InvocationTargetException একটি checked exception এবং এটি Method.invoke() মেথডের মাধ্যমে ঘটে, তাই এর ব্যবস্থাপনা করতে হলে আপনি try-catch ব্লক ব্যবহার করবেন।

  1. getCause():
    • InvocationTargetException এর মাধ্যমে আসা মূল এক্সেপশনটি পেতে আপনি getCause() মেথড ব্যবহার করতে পারেন। এটি মূল এক্সেপশনটি ফেরত দেয়, যা মেথডের ভিতরে ঘটেছিল।
  2. 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 ব্যবস্থাপনা টিপস:

  1. getCause() ব্যবহার করুন:
    • InvocationTargetException যখন থ্রো হয়, তখন মূল এক্সেপশনটি বের করার জন্য getCause() ব্যবহার করুন। এটি আপনাকে মূল এক্সেপশনের অবস্থা বা মেসেজ জানতে সাহায্য করবে।
  2. Exception Chaining:
    • InvocationTargetException একটি exception chaining সাপোর্ট করে, যার মাধ্যমে আপনি আসল এক্সেপশনটি শনাক্ত করতে পারেন।
  3. try-catch ব্লক:
    • InvocationTargetException এর ব্যবস্থাপনার জন্য আপনার রিফ্লেকশন কোডকে try-catch ব্লকের মধ্যে রাখতে হবে এবং এক্সেপশন হ্যান্ডলিং করতে হবে।
  • InvocationTargetException হল একটি wrapper exception যা Method.invoke() মেথডের মাধ্যমে এক্সেপশন হ্যান্ডলিংয়ের সময় ঘটে।
  • এর মাধ্যমে মূল এক্সেপশনটি (যে এক্সেপশনটি আসলে মেথডের ভিতরে ঘটেছিল) অ্যাক্সেস করা সম্ভব।
  • getCause() মেথডটি ব্যবহার করে আপনি মূল এক্সেপশনের তথ্য পেতে পারেন এবং সেই এক্সেপশনটির যথাযথ ব্যবস্থাপনা করতে পারেন।
Content added By
Promotion

Are you sure to start over?

Loading...