কম্পিউটার টিউটোরিয়াল

জাভাতে IllegalArgumentException কীভাবে সমাধান করবেন?


একটি IllegalArgumentException থ্রো করা হয় একটি মেথডে ইলিগ্যাল আর্গুমেন্ট পাস করা হয়েছে তা ইন্ডিকেট করার জন্য। এই এক্সেপশন RuntimeException ক্লাস এক্সটেন্ড করে এবং তাই JVM-র অপারেশনের সময় থ্রো হওয়া এক্সেপশনগুলোর ক্যাটাগরিতে পড়ে। এটি একটি আনচেকড এক্সেপশন এবং তাই মেথড বা কন্সট্রাক্টরের throws clause-এ ডিক্লেয়ার করার প্রয়োজন নেই।

java.lang.IllegalArgumentException-এর কারণগুলো

  • যদি আর্গুমেন্ট রেঞ্জের বাইরে হয়। উদাহরণস্বরূপ, পারসেন্টেজ ১ থেকে ১০০ এর মধ্যে হওয়া উচিত। যদি ইউজার ১০১ দেয়, তবে IllegalArgumentException থ্রো হবে।
  • যদি আর্গুমেন্ট ফরম্যাট ইনভ্যালিড হয়। উদাহরণস্বরূপ, আমাদের মেথডে ডেট ফরম্যাট YYYY/MM/DD দরকার কিন্তু ইউজার YYYY-MM-DD পাস করছে। তাহলে মেথডটি বুঝতে পারবে না এবং IllegalArgumentException থ্রো হবে।
  • যদি একটি মেথডে নন-এমপ্টি স্ট্রিং প্যারামিটার হিসেবে দরকার হয় কিন্তু নাল স্ট্রিং পাস করা হয়।

উদাহরণ ১

public class Student {
    int m;
    public void setMarks(int marks) {
        if(marks < 0 || marks > 100)
            throw new IllegalArgumentException(Integer.toString(marks));
        else
            m = marks;
    }
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setMarks(45);
        System.out.println(s1.m);
        Student s2 = new Student();
        s2.setMarks(101);
        System.out.println(s2.m);
    }
}

আউটপুট

45
Exception in thread "main" java.lang.IllegalArgumentException: 101
    at Student.setMarks(Student.java:5)
    at Student.main(Student.java:15)

IllegalArgumentException সমাধানের ধাপগুলো

  • যখন একটি IllegalArgumentException থ্রো হয়, আমাদের জাভার স্ট্যাক ট্রেসের কল স্ট্যাক চেক করতে হবে এবং সেই মেথডটি লোকেট করতে হবে যেটি ভুল আর্গুমেন্ট প্রডিউস করেছে।
  • IllegalArgumentException খুবই উপকারী এবং অনচেকড ইনপুট ডেটা সাথে অ্যাপ্লিকেশন কোডকে ডিল করতে হয় এমন পরিস্থিতি এড়াতে ব্যবহার করা যায়।
  • এই IllegalArgumentException-এর মুখ্য ব্যবহার হলো অন্যান্য ইউজার থেকে আসা ইনপুট ভ্যালিডেট করা।
  • যদি আমরা IllegalArgumentException ক্যাচ করতে চাই, তবে try-catch ব্লক ব্যবহার করতে পারি। এটি করলে আমরা কিছু পরিস্থিতি হ্যান্ডেল করতে পারি। ধরুন catch ব্লকে আমরা কোড লিখি ইউজারকে আবার ইনপুট দেয়ার সুযোগ দিতে বদলে এক্সিকিউশন রোকার বদলে, ειδ করে লুপিং কেসে।

উদাহরণ ২

import java.util.Scanner;
public class Student {
    public static void main(String[] args) {
        String cont = "y";
        run(cont);
    }
    static void run(String cont) {
        Scanner scan = new Scanner(System.in);
        while( cont.equalsIgnoreCase("y")) {
            try {
                System.out.println("Enter an integer: ");
                int marks = scan.nextInt();
                if (marks < 0 || marks > 100)
                    throw new IllegalArgumentException("value must be non-negative and below 100");
                System.out.println( marks);
            }
            catch(IllegalArgumentException i) {
                System.out.println("out of range encouneterd. Want to continue");
                cont = scan.next();
                if(cont.equalsIgnoreCase("Y"))
                    run(cont);
            }
        }
    }
}

আউটপুট

Enter an integer: 1
1
Enter an integer: 100
100
Enter an integer: 150
out of range encouneterd. Want to continue
y
Enter an integer:
  1. জাভাতে ডিফল্ট মেথড ব্যবহার করে ডায়ামন্ড সমস্যা সমাধান

  2. জাভাতে এক্সেপশন কীভাবে রি-থ্রো (rethrow) করবেন?

  3. জাভাতে IllegalArgumentException কীভাবে সমাধান করবেন?

  4. জাভাতে JSON পার্সিং: জনপ্রিয় লাইব্রেরি সহ পূর্ণাঙ্গ গাইড