এক্সেপশনের
ফ্যামিলি নিয়ে বলেছিলাম যে একবার ঐটা এখন লাগবে হালকা।
ইউজার
ডিফাইন এক্সেপশন শিখব এখন, মানে আপনি আপনার ইচ্ছা মত এক্সেপশন বানাইতে পারবেন ১০০%
ফ্রি। কেউ বলতে আসবে না এইটা কি বানাইলা, আপনি যদি চান ইউজার ১ ইনপুট দিলে আপনি ঐটার
জন্যেও এক্সেপশন থ্রো করবেন আপনি সেটাও পারবেন, ইচ্ছে মত খেলতে পারবেন এক্সেপশন নিয়ে।
১। আপনার মনে যদি এই প্রশ্ন আনচান করে উঠে
জাভাতে এত Built-in এক্সেপশন থাকতে আমরা ক্যান গায়ে খেটে এক্সেপশন বানাবো?
তাহলে মনকে শান্তনা দিবেন এভাবে...
আমরা নিজেদের বানানো শর্তের আওতায় কোনো এক্সেপশন দেখাইতে চাই তখন আমরা throw ইউজ করব, ওকে ? বুঝেন নাই তো? বুঝবেন কিন্তু দেরিতে
এক্সেপশন এর ফ্যামিলি দুই ধরনের, যেমনঃ ১।চেকড , ২। রানটাইম(আনচেকড)
জাভাতে এত Built-in এক্সেপশন থাকতে আমরা ক্যান গায়ে খেটে এক্সেপশন বানাবো?
তাহলে মনকে শান্তনা দিবেন এভাবে...
আমরা নিজেদের বানানো শর্তের আওতায় কোনো এক্সেপশন দেখাইতে চাই তখন আমরা throw ইউজ করব, ওকে ? বুঝেন নাই তো? বুঝবেন কিন্তু দেরিতে
ধরেন
একটা প্রোজেক্ট বানাতে বলা হইসে, “ভোটিং মেশিন” ১৮ বছরের নিচে কেউ ভোট দিতে পারবে না,
তাই আপনি ১৮ বছরের নিচের কেউ ভোট দিলে এক্সেপশন থ্রো করতে চান, তখন আমরা নিজের থ্রো (throw) ইউজ করব, কারণ জাভার এক্সেপশন ক্লাসের মধ্যে কোনো ক্লাসেই এমন নাই যে ১৪, ১৫,৫ এগুলা
ইনপুটের জন্য আপনাকে এক্সেপশন থ্রো করে দিবে বা এরর দেখাবে, এটা আপনার ব্যক্তিগত সমস্যা তাই আপনাকে নিজের সুবিধা অনুযায়ী থ্রো করা লাগবে।
বুঝলেন তো? কোড দেখি চলেন,
public
class Main{
public static void main(String[] args) {
int age=15;
if(age<18){
1. throw new
ArithmeticException("Dil toh baccha hai ji");
}
else{
System.out.println("ssshhhhh");
}
}
}
Output:
Exception in thread "main" java.lang.ArithmeticException:
Dil toh baccha hai ji
at package.class.method(class.java:1)
এইখানে
১৮ এর নিচের ইনপুটের জন্য আমাদের এক্সেপশন থ্রো হবে , আমরা ক্যাচ ব্লক লিখিনি, তাই
জাভার Default Exception Handling এর ক্যাচ মেকানিজম এটা ক্যাচ করে প্রিন্ট করে প্রোগ্রাম
বন্ধ করে দিবে। তাহলে কি হলো? আমরা এক্সেপশন থ্রো করলাম, জাভা ক্যাচ করল।
এইরকম অনেক সময় নিজের দেয়া শর্তের মধ্যে এক্সেপশন থ্রো এর দরকার পরে, তাই আমরা ইউজার-ডিফাইন এক্সেপশন শিখব।
এইরকম অনেক সময় নিজের দেয়া শর্তের মধ্যে এক্সেপশন থ্রো এর দরকার পরে, তাই আমরা ইউজার-ডিফাইন এক্সেপশন শিখব।
এক্সেপশন এর ফ্যামিলি দুই ধরনের, যেমনঃ ১।চেকড , ২। রানটাইম(আনচেকড)
Throwable
> Exception >
1.Checked Exception
i. FileInputStream
ii. SQLException
iii. IOException
2. RuntimeException
1.Checked Exception
i. FileInputStream
ii. SQLException
iii. IOException
2. RuntimeException
i. ArithmeticException
ii.
StackOverFlowException
iii. ArrayIndexOutOfBoundsException
ইত্যাদি…।।
তো আমরা যে এক্সেপশন বানাবো তার মধ্যেও চেকড or আনচেকড এর যেকোনো একটার বৈশিষ্ট্য থাকতে হবে, তবেই তো এক্সেপশন হবে, বৈশিষ্ট্য কপি করার অন্যতম উপায় হচ্ছে extend করা। তাই আমাদের এক্সেপশনের যেকোনো একটা ক্লাস এক্সটেন্ড করতে হবে।
এখন আমরা যে নিজের হাতে এক্সেপশন বানাবো, তো সেটা কোন ধরনের হবে ? চেকড নাকি রানটাইম ?
Exception ক্লাসের আন্ডারে সব এক্সেপশন পড়ে , মানে চেকড(Checked) , আনচেকড(Unchecked)। তাই এক্সেপশন এক্সটেন্ড করে সব এক্সেপশন ইউজ করতে পারব, কিন্তু রানটাইম এক্সেপশনগুলো শুধু RuntimeException ক্লাসের মধ্যেই থাকে।তাই রানটাইম এক্সেপশন বানানোর জন্য RuntimeException ক্লাসকে এক্সটেন্ড করতে হয়।
এখন আমরা যে নিজের হাতে এক্সেপশন বানাবো, তো সেটা কোন ধরনের হবে ? চেকড নাকি রানটাইম ?
Exception ক্লাসের আন্ডারে সব এক্সেপশন পড়ে , মানে চেকড(Checked) , আনচেকড(Unchecked)। তাই এক্সেপশন এক্সটেন্ড করে সব এক্সেপশন ইউজ করতে পারব, কিন্তু রানটাইম এক্সেপশনগুলো শুধু RuntimeException ক্লাসের মধ্যেই থাকে।তাই রানটাইম এক্সেপশন বানানোর জন্য RuntimeException ক্লাসকে এক্সটেন্ড করতে হয়।
মনযোগ দেনঃ
যদি
চাই যে আমরা যে এক্সেপশন বানাবো তার বৈশিষ্ট্য চেকড এক্সেপশন এর মত হউক তাহলে এক্সটেন্ড করব
“Exception”
ক্লাসকে।
আর
যদি আনচেকড এক্সেপশন বা রানটাইম এক্সেপশন বানাইতে চাই
তাহলে এক্সটেন্ড করব “RuntimeException” ক্লাসকে
।
এক্সেপশনের
নাম ও নিজের ইচ্ছা মত দিবেন, যেমন আমি দিসি এইখানে
class
IntegerResultNotFound extends Exception{
IntegerResultNotFound(){
super("Answer is not an
integer");
}
}
public
class M{
public static void main(String[] args)
throws IntegerResultNotFound{
int a=25;
int b=3;
int c=a/b;
int c=a/b;
if(a%b!=0){
throw new IntegerResultNotFound();
}
else
System.out.println("Answer is
Integer");
}
}
আউটপুটঃ
Exception in thread "main" package.IntegerResultNotFound:
Answer is not an integer
at package.M.main(M.java:12)
২৫/৩=৮.৩৩৩৩৩৩৩..................
"IntegerResultNotFound" এই নামের কিন্তু কোনো এক্সেপশন নাই, এটা আমি দিয়েছি, আপনার অন্যকিছু ভাল্লাগলে ঐটা দিবেন।
এইখানে আমি এক্সটেন্ড করেছি Exception ক্লাসকে, মানে আমি যে এক্সেপশন টা বানাইলাম (IntegerResultNotFound) এটা চেকড এক্সেপশন । আর যেহেতু চেকড এক্সেপশন তাই মেইন মেথডকে ‘throws’ keyword দিয়ে রিপোর্ট করতে হইসে, Same কোড দেখব রানটাইম এক্সেপশন দিয়ে।
(যদি ধরে নেই আগের পোষ্ট পড়ে এসেছেন , তাহলে throw , throws কোথায়, কেন এগুলা বুঝেছেন আশা করি)
class IntegerResultNotFound extends RuntimeException{
IntegerResultNotFound(){
super("Answer is not an integer");
}
}
public class M{
public static void main(String[] args){
int a=25;
int b=3;
int c=a/b;
if(a%b!=0){
throw new IntegerResultNotFound();
}
else
System.out.println("Answer is Integer");
}
}
আউটপুটঃ
Exception in thread "main" package.IntegerResultNotFound: Answer is not an integer
at package.M.main(M.java:12)
দেখেন
আউটপুট Same কিন্তু ‘throws’ keyword ইউজ করিনি কারণ এক্সটেন্ড করেছি “RuntimeException” ক্লাসকে। অর্থাৎ এটা একটা আনচেকড এক্সেপশন
তৈরী হয়েছে। আর আনচেকড এক্সেপশন কম্পাইলার ধরতে পারে না, তাই কম্পাইলারকে throws দিয়ে রিপোর্ট করতে হয়নি।
তো
এভাবে আমরা ইউজার ডিফাইন এক্সেপশন বানাইতে পারি, এক্সেপশন হ্যান্ডেল করার নিয়ম আগের
গুলার মতোই।
নিজের এক্সেপশন অবশ্যই বানিয়ে দেখবেন।
গুড
নাইট, টা টা , সি ইউ।

Comments
Post a Comment