Skip to main content

try, catch and finally block (part – 01) (post-4)




<-Previous Topic


পোষ্ট ১ থেকে পড়ে আসলে সুবিধা পাবেন পাক্কা।


try ব্লক: কোন কোড ব্লকে যদি এরর হওয়ার সম্ভাবনা থাকে তাহলে সেই   কোডকে  try  ব্লকের মধ্যে রাখতে হয়।


catch: try ব্লকের সঙ্গেই catch ব্লক লিখতে হয়। একটি try  ব্লকের সঙ্গে একাধিক catch ব্লক থাকতে পারে।তবে একটি ক্যাচ অথবা finally থাকতেই হবে try  এর সাথে
try ব্লকের কোডে যদি এরর হয় তখন try ব্লক একটা এক্সেপশন থ্রো করে আর catch ব্লক সেই এক্সেপশন রিসিভ করে পরের কোড এক্সিকিউট করে।


public class Main{
        public static void main(String[] args){
try{
                System.out.println(5/0);
         }  catch(ArithmeticException   jekonoVariableName){

//যদি try ব্লকে আসলেই এরর টা হয় তাহলে এই ক্যাচ ব্লক //এক্সিকিউট হবে নাহলে try থেকে পরের গুলাই চলে যাবে ক্যাচ ব্লকে আসবে না।

System.out.println(“Catch block executed”);
                }
}
}

উপরের (5/0) এক্সেপশনটা কোন ধরনের বলেন তো?
Ans: ArithmeticException  // (যোগ, বিয়োগ,গুণ,ভাগ জনিত Exception)
এটা কিন্তু Unchecked Exception,  কারণ কম্পাইলার এটা চেক করতে পারেনা।

try{

        System.out.println(5/0);

}catch(ArithmeticException obj){  //ArithmeticException class er object,

System.out.println(“Catch block”);
}


 কারণ (5/0) এক্সেপশন যখন আসবে তখন জাভা একটা এক্সেপশন থ্রো করবে, আর ঐটা আমরা ক্যাচ ব্লকের মাধ্যমে রিসিভ করবো, যাতে জাভার ডিফল্ট ক্যাচ ব্লকের কাছে না যায়, তাই আমরা নিজেরা ক্যাচ ব্লক লিখেছি,

আর যে ক্যাচ ব্লক লিখলাম সেটা কোন ধরনের এক্সেপশন রিসিভ করতে পারবে আমাদের এটাও বলে দেয়া লাগবে। ArithmeticException.

মানে ক্যাচ ব্লকের মধ্যে এক্সেপশন ক্লাসের বাচ্চাদের নাম ইউজ করা লাগবে(ArithmeticException, FileNotFoundException etc etc)

যদি ArithmeticException  ঘটে শুধু তাহলেই ঐ ক্যাচ ব্লক কাজ করবে, ধরেন,


public class Main{
        public static void main(String[] args){
try{
        int [] n=new int [5];
System.out.println(n[10]);
}catch(ArithmeticException e){
        System.out.println(“It works if Arithmetic exception occurs”);
}
}
}

উপরের কোডে কিন্তু try, catch  কাজ করবে না, কেন?
কারণ আমরা ক্যাচ ব্লকের মধ্যে কোন এক্সেপশন রিসিভ করেছি? ArithmeticException.  কিন্তু আমাদের try ব্লকের মধ্যে এক্সেপশন হবে ArrayIndexOutOfBoundsException.

তাই আমাদের এই কোড এইবার catch  ব্লকের মধ্যে ArrayIndexOutOfBoundsException খোজার চেষ্টা করবে, খুজে না পেয়ে জাভার ডিফল্ট ক্যাচ ব্লকে চলে যাবে এবং এক্সেপশন প্রিন্ট করার মাধ্যমে আমাদের প্রোগ্রাম বন্ধ করে দিবে। আমরা যদি এটাকে হ্যান্ডেল করতে চাই, তাহলে কোড টা এমন হতে হবেঃ


public class Main{
        public static void main(String[] args){
try{
        int [] n=new int [5];
System.out.println(n[10]);
} catch(ArithmeticException e){
        System.out.println(“It works if Arithmetic exception occurs”);
}catch(ArrayIndexOutOfBoundsException obj){
        System.out.println(“Exception: “+obj.getMessage());
}

System.out.println(“After Exceptions”);
}
}

তাহলে এইবার কি হবে?

try ব্লকের মধ্যে ArrayIndexOutOfBoundsException  হবে এবং জাভা এক্সেপশনটি  থ্রো করবে ক্যাচ ব্লকের কাছে, যেহেতু আমরা ক্যাচ ব্লক লিখেছি, তাই জাভা নিজের ক্যাচ ব্লকে না যেয়ে আগে আমাদের ক্যাচ ব্লক গুলা চেক করবে যে ঐ এক্সেপশন রিসিভ করার মতো কেউ আছে কিনা। প্রথম ক্যাচ ব্লক ArithmeticException  রিসিভ করতে চাই, তাই এইবার পরের ক্যাচ ব্লকের কাছে যাবে এবং সেখানে ArrayIndexOutOfBoundsException receiver  পেয়ে যাবে তাই ঐ ক্যাচ ব্লক থেকে এক্সিকিউট হবে।


try ব্লকের মধ্যে সব থেকে কম কোড লিখা উচিত, কারণ যেই লাইনে এক্সেপশন হবে তার পরের লাইন থেকে আর কাজ করবে না।

ধরেন  try ব্লকের মধ্যে ৩ লাইন কোড লিখেছেন, দুই নাম্বার লাইনে যদি এক্সেপশন পেয়ে যায় তাহলে ওইখান থেকেই ক্যাচ ব্লকে দৌড় দিবে, ঐ তিন নাম্বার লাইনটা আর এক্সিকিউট হবে না।

Throwable ক্লাসে কতগুলো পাবলিক মেথড রয়েছে।
এগুলো ব্যবহার করে কোনো এক্সেপশন কোথায় হয়েছে , কেন হয়েছে তার কারণগুলো খুজে বের করা যায়। মেথডগুলো হলো,


getMessage(): কেন এরর হইসে শুধু এটা প্রিন্ট করবে ছোট করে।যেমনঃ / by zero.

toString(): এক্সেপশনের নাম আর কেন হইসে এটা প্রিন্ট করবে।যেমনঃ java.lang.ArithmeticException ,  / by zero

printStackTrace():  এক্সেপশনের নাম, ঠিকানা ,কেন হইসে। ঠিকানা মানে প্যাকেজ নাম,ক্লাস নাম,কত নাম্বার লাইনে এরর সব প্রিন্ট করে দিবে।যেমনঃ java.lang.ArithmeticException , / by zero,  উমুক প্যাকেজ, তমুক ক্লাস, উমুক মেথড, এত নাম্বার লাইন সব।









 Finally...


Finally ব্লক নিয়ে কিছু বলে নেই,  try  ব্লক ছাড়া finally  থাকতে পারবে না।
Syntax:
try{
        //Exception আসতে পারে এমন কোডস
        }
catch{
        //Handling Exception
        }
finally{
        //এক্সিকিউট হতে বাধ্য লাইনস
        }

১। Finally ব্লক Optional, কোনো লাইন যদি এক্সিকিউট করতেই হবে এমন থাকে তাহলে এটা ইউজ করব , নাহলে দরকার নেই।

২। try  ব্লকে এক্সেপশন থাকলেও এটা এক্সিকিউট হবে, এক্সেপশন না থাকলেও এটা এক্সিকিউট হবে।

৩। try ব্লকে return, break etc etc ইউজ করলেও ফাইনাল এক্সিকিউট হবেই।



পোষ্ট -১ থেকে পড়লে বেশি ভাল বুঝবেন।

    <-Previous Topic                                                                       Next Topic->catch-throw



Move to:
Post 7              Post 8
Post 6              Post 9
Post 5 
Post 4
Post 3 
Post 2 
Post 1


Comments

Popular posts from this blog

IELTS Spoken Class Adminssion Scenario - 01

.......  Student: Hello, May I come in, sir ? Optional (student): May I sit ? Sir:  Please have a seat. Sir: How may I help you, Sir ? Student: I would like to admit in your spoken course. Sir: Oh sure. Student: How many days are there in a week ? Sir: There are three classes in a week. Student: What time do you offer class ? Sir: We have class at 11am / 4pm / 6pm / 8pm

Php Learning Time

 Differences of explode( ) and implode( ) in php: explode: একটা স্ট্রিংকে কোনো একটা সেপারেটরের বেসিসে অ্যারেতে কনভার্ট করে, যেমন  <?php $text="Hello How are you?"; print_r(explode(" ",$text)); ?> This will give output of  Array (     [0] => Hello     [1] => How     [2] => are     [3] => you? ) Differences of array_splice( ) and array_slice( ) ধরেন আসল অ্যারে হচ্ছে    $arr =[ "Hello" , "this" , "is" , "test" , "text" ];    এখন এটাকে স্লাইসিং করার জন্য আমরা উপরের দুইটা মেথড ই ব্যবহার করতে পারি , কিন্তু array_splice এটা ইউজ করলে অরজিনাল array ও চেঞ্জ হয়ে যাবে, মানে যদি আমরা এভাবে লিখি  $var2 = array_splice ( $arr , 0 , 2 );   তাইলে $var2 এর ভিতরে থাকবে ["Hello" , "this"] ,  আর অরজিনাল array তে বাকি থাকবে ["is", "test", "text"] কিন্তু যদি আমরা ইউজ করি তাহলে অরজিনাল array আগের মতোই থাকবে পাশাপাশি $var2 এর মধ্যে ভ্যালু গুলা এসে পড়বে  Array (     [0] => ...