হ্যাঁ, জাভাতে মেথড ওভাররাইডিং-এ চেকড এক্সেপশন হ্যান্ডলিং-এ পেরেন্ট-চাইল্ড হিয়ারার্কি অত্যন্ত গুরুত্বপূর্ণ। নিয়মগুলো হলো:
- সাবক্লাসের মেথড সুপারক্লাসের মেথডের চেয়ে সেইম এক্সেপশন বা তার সাব-টাইপ (ন্যারোয়ার) থ্রো করতে পারে।
- সাবক্লাসের মেথড সুপারক্লাসের এক্সেপশনের সুপার-টাইপ (ব্রোডার) থ্রো করতে পারে না।
- সাবক্লাসের মেথড কোনো এক্সেপশন থ্রো না করে ওভাররাইড করতে পারে (এটি সবচেয়ে ন্যূনতম)।
উদাহরণ ১: বৈধ (সাব-টাইপ থ্রো করা)
ArrayIndexOutOfBoundsException হলো IndexOutOfBoundsException-এর সাবক্লাস।
class Demo {
public void sample() throws ArrayIndexOutOfBoundsException {
System.out.println("sample() method of the Demo class");
}
}
class SuperTest extends Demo {
public void sample() throws IndexOutOfBoundsException { // সুপার-টাইপ থ্রো করা হয়েছে (ভুল!)
System.out.println("sample() method of the SuperTest class");
}
}
public class Test extends SuperTest {
public static void main(String args[]) {
Demo obj = new SuperTest();
try {
obj.sample();
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("Exception");
}
}
}
নোট: উপরের উদাহরণে সাবক্লাসে সুপার-টাইপ (IndexOutOfBoundsException) থ্রো করা হয়েছে, যা নিয়ম লঙ্ঘন। এটি কম্পাইল এরর দেবে। নিচের উদাহরণটি সঠিক।
উদাহরণ ২: বৈধ (সাব-টাইপ থ্রো করা - সঠিক)
import java.io.IOException;
import java.io.EOFException; // IOException-এর সাবক্লাস
class Demo {
public void sample() throws IOException {
System.out.println("sample() method of the Demo class");
}
}
class SuperTest extends Demo {
public void sample() throws EOFException { // সাব-টাইপ থ্রো করা (সঠিক)
System.out.println("sample() method of the SuperTest class");
}
}
public class Test extends SuperTest {
public static void main(String args[]) {
Demo obj = new SuperTest();
try {
obj.sample();
} catch (EOFException ex) {
System.out.println("Exception caught: " + ex);
}
}
}
উদাহরণ ৩: অবৈধ (সুপার-টাইপ থ্রো করা - এরর)
class Demo {
public void sample() throws EOFException { // সাব-টাইপ
System.out.println("Demo");
}
}
class SuperTest extends Demo {
public void sample() throws IOException { // সুপার-টাইপ (ভুল!)
System.out.println("SuperTest");
}
}
// কম্পাইল এরর: overridden method does not throw IOException
কারণ: পলিমরফিজমে Demo obj = new SuperTest(); হলে কলার EOFException ক্যাচ করার কোড লিখে। কিন্তু সাবক্লাস IOException থ্রো করলে কলার সেটি ক্যাচ করতে পারবে না (কারণ IOException ব্রোডার)। এই কারণে জাভা এটিকে কম্পাইল টাইমে বাধা দেয়।