"হাই, অ্যামিগো। আজ আমরা একটি খুব আকর্ষণীয় পাঠ পেতে যাচ্ছি। আমি আপনাকে ব্যতিক্রম সম্পর্কে বলতে যাচ্ছি। ব্যতিক্রম হল একটি বিশেষ প্রক্রিয়া যা আমাদের প্রোগ্রামে ত্রুটিগুলি পরিচালনা করতে দেয়। এখানে কিছু ত্রুটির উদাহরণ রয়েছে যা ঘটতে পারে একটি প্রোগ্রামে:

1. হার্ড ড্রাইভ সম্পূর্ণরূপে পূর্ণ হলে প্রোগ্রামটি একটি ফাইল লেখার চেষ্টা করতে পারে।

2. প্রোগ্রামটি একটি নাল রেফারেন্স সংরক্ষণ করে একটি ভেরিয়েবলের একটি পদ্ধতি কল করার চেষ্টা করতে পারে।

3. প্রোগ্রামটি একটি সংখ্যাকে 0 দ্বারা ভাগ করার চেষ্টা করতে পারে।"

এই সমস্ত কর্ম ত্রুটির ফলে. সাধারণত, ফলাফলটি হল যে প্রোগ্রামটি অবিলম্বে বন্ধ হয়ে যায়, যেহেতু এই ক্ষেত্রে কোড চালানো চালিয়ে যাওয়ার কোন মানে হয় না।

"কেন?"

"গাড়ি রাস্তা থেকে সরে গেলে এবং পাহাড় থেকে পড়ে গেলে চাকা ঘুরিয়ে রাখার কি কোন মানে হয়?"

"প্রোগ্রাম চালানো বন্ধ করা উচিত, তাহলে?"

"হ্যাঁ। অন্তত, এটাই হতো। কোনো ত্রুটির কারণে প্রোগ্রামটি বন্ধ হয়ে যায়।"

"এটি একটি খুব স্মার্ট পদ্ধতি।"

"কিন্তু প্রোগ্রামটি চালিয়ে যাওয়া কি ভালো হবে না?"

"হ্যাঁ। ধরুন আপনি ওয়ার্ডে প্রচুর পরিমাণে টেক্সট টাইপ করেছেন এবং এটি সংরক্ষণ করেছেন। সেভ অপারেশন ব্যর্থ হলে কী হবে, কিন্তু প্রোগ্রামটি আপনাকে বিশ্বাস করে যে সবকিছু ঠিক আছে? এবং আপনি টাইপ করতে যান। এটি বোকামি হবে, তাই না? এটা?"

"হ্যাঁ।"

"তারপর প্রোগ্রামাররা একটি আকর্ষণীয় সমাধান নিয়ে এসেছিল: প্রতিটি ফাংশন তার কাজের স্থিতি ফিরিয়ে দেবে। 0 এর অর্থ হল এটি প্রত্যাশিত হিসাবে কাজ করেছে। অন্য কোনও মান মানে কিছু ত্রুটি ঘটেছে, এবং ফেরত মানটি একটি ত্রুটি কোড ছিল।"

"তবে, সেই পদ্ধতিরও তার ত্রুটি রয়েছে৷ প্রতিটি (!) ফাংশন কলের পরে, আপনাকে রিটার্ন কোড (নম্বর) পরীক্ষা করতে হবে৷ প্রথমত, এটি অসুবিধাজনক: ত্রুটি-হ্যান্ডলিং কোড খুব কমই কার্যকর করা হয় তবে অন্তর্ভুক্ত করা প্রয়োজন৷ সর্বত্র। দ্বিতীয়ত, ফাংশনগুলি প্রায়শই বিভিন্ন মান ফেরত দেয় - আপনি তাদের সাথে কি করতে চান?"

"ঠিক আছে। আমিও সেটা ভেবেছিলাম।"

"তারপর, একটি উজ্জ্বল ভবিষ্যত ব্যতিক্রম এবং একটি ত্রুটি-হ্যান্ডলিং পদ্ধতির আকারে এসেছে৷ এটি কীভাবে কাজ করে তা এখানে:

1. একটি ত্রুটি ঘটলে, জাভা মেশিন একটি বিশেষ বস্তু তৈরি করে - একটি ব্যতিক্রম - যেখানে এটি সমস্ত ত্রুটির তথ্য সংরক্ষণ করে৷ বিভিন্ন ত্রুটির জন্য বিভিন্ন ব্যতিক্রম আছে।

2. একটি ব্যতিক্রম প্রোগ্রামটিকে অবিলম্বে বর্তমান ফাংশন এবং পরবর্তী ফাংশন থেকে প্রস্থান করে, এবং তাই - যতক্ষণ না এটি মূল পদ্ধতি থেকে প্রস্থান করে। তারপর প্রোগ্রামটি বন্ধ হয়ে যায়। প্রোগ্রামাররাও বলতে পারে যে জাভা মেশিন 'কল স্ট্যাক খুলে দেয়'।"

"কিন্তু আপনি বলেছেন যে প্রোগ্রামটি সবসময় শেষ হয় না।"

"হ্যাঁ, কারণ একটি ব্যতিক্রম ধরার একটি উপায় আছে। আমরা বিশেষ কোড লিখতে পারি সঠিক জায়গায় ব্যতিক্রমগুলি ধরতে এবং তাদের সাথে কিছু করার জন্য। এটি গুরুত্বপূর্ণ বিষয়।"

"আমাদের এটি করতে সাহায্য করার জন্য, এখানে একটি বিশেষ ট্রাই-ক্যাচ কনস্ট্রাক্ট রয়েছে ৷ এটি কীভাবে কাজ করে তা এখানে:"

একটি প্রোগ্রামের উদাহরণ যা একটি ব্যতিক্রম (0 দ্বারা বিভাজন) ধরে এবং কাজ চালিয়ে যায়।
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (Exception e)
        {
           System.out.println("Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}
স্ক্রীন আউটপুট:
Program starts
Before method1 calling
Exception has been caught
Program is still running

"কিন্তু কেন 'আফটার কলিং মেথড1। এটি কখনই দেখানো হবে না' স্ক্রিনে প্রদর্শিত হবে না?"

"আমি খুশি যে আপনি জিজ্ঞাসা করেছেন। লাইন 25-এ, আমরা 0 দিয়ে ভাগ করি, যা একটি ত্রুটির দিকে নিয়ে যায় - একটি ব্যতিক্রম। জাভা মেশিন ত্রুটি সম্পর্কে তথ্য সহ একটি ArithmeticException অবজেক্ট তৈরি করে। অবজেক্টটি ব্যতিক্রম।"

"ব্যতিক্রমটি method1পদ্ধতির মধ্যে ঘটে। এর ফলে পদ্ধতিটি অবিলম্বে বন্ধ হয়ে যায়। এটি ট্রাই-ক্যাচ ব্লকের জন্য না হলে মূল পদ্ধতিটি বন্ধ করে দেবে।"

"যদি একটি চেষ্টা ব্লকের মধ্যে একটি ব্যতিক্রম ঘটে , তবে এটি ক্যাচ ব্লকে ধরা পড়ে। চেষ্টা ব্লকের অবশিষ্ট কোডটি কার্যকর করা হবে না। পরিবর্তে, ক্যাচ ব্লকটি কার্যকর করা শুরু হবে। "

"আমি এটা বুঝতে পারছি না।"

"অন্য কথায়, কোডটি এইরকম কাজ করে:

1. চেষ্টা ব্লকের মধ্যে যদি একটি ব্যতিক্রম ঘটে , তবে কোডটি কার্যকর করা বন্ধ হয়ে যায় যেখানে ব্যতিক্রম ঘটেছে এবং ক্যাচ ব্লকটি কার্যকর করা শুরু হয়।

2. যদি কোন ব্যতিক্রম ঘটে না, তাহলে চেষ্টা ব্লকটি শেষ পর্যন্ত কার্যকর করা হয় এবং ক্যাচ ব্লকটি কার্যকর করা হয় না। "

"হুহ?"

"ভাবুন যে প্রতিটি মেথড কলের পরে আমরা পরীক্ষা করি যে পদ্ধতিটি স্বাভাবিকভাবে ফিরে এসেছে বা একটি ব্যতিক্রমের ফলে হঠাৎ করে বন্ধ হয়ে গেছে। যদি একটি ব্যতিক্রম থাকে, তাহলে আমরা ব্যতিক্রমটি ধরার জন্য ক্যাচ ব্লক (যদি একটি থাকে) কার্যকর করতে চলে যাই। যদি কোন ক্যাচ ব্লক না থাকে, তাহলে আমরা বর্তমান পদ্ধতিটি বন্ধ করে দিই, এবং যে পদ্ধতিটি আমাদের ডাকা হয় সেটি একই পরীক্ষা করে।"

"আমি মনে করি আমি এখন এটি পেয়েছি।"

"চমৎকার।"

"ক্যাচ স্টেটমেন্টের ভিতরে 'ব্যতিক্রম' মানে কি?"

" সমস্ত ব্যতিক্রম হল এমন ক্লাস যা ব্যতিক্রম ক্লাসের উত্তরাধিকারী হয়৷ আমরা ক্যাচ ব্লকে ব্যতিক্রম ক্লাস নির্দিষ্ট করে একটি বিশেষ ব্যতিক্রম ধরতে পারি , অথবা আমরা তাদের সাধারণ অভিভাবক শ্রেণি - ব্যতিক্রম উল্লেখ করে সমস্ত ব্যতিক্রম ধরতে পারি৷ তারপর আমরা সমস্ত প্রয়োজনীয় ত্রুটি পেতে পারি পরিবর্তনশীল ই থেকে তথ্য (এটি ব্যতিক্রম বস্তুর একটি রেফারেন্স সংরক্ষণ করে)।"

"কুল! আমার পদ্ধতিতে যদি ভিন্ন ব্যতিক্রম ঘটে, তাহলে আমি কি সেগুলিকে ভিন্নভাবে প্রক্রিয়া করতে পারি?"

"শুধু আপনিই পারবেন না, আপনার উচিতও। আপনি এটি এভাবে করতে পারেন:"

উদাহরণ:
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (NullPointerException e)
        {
           System.out.println("Null reference. Exception has been caught");
        }
        catch (ArithmeticException e)
        {
            System.out.println("Division by zero. Exception has been caught");
        }
        catch (Exception e)
        {
            System.out.println("Any other errors. Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}

" ট্রাই ব্লকটি বেশ কয়েকটি ক্যাচ ব্লকের সাথে যুক্ত করা যেতে পারে , যার প্রত্যেকটি নির্দিষ্ট ধরণের ব্যতিক্রমগুলি ধরবে।"

"আমি মনে করি আমি বুঝতে পেরেছি। আমি এখনও এটি নিজে লিখতে পারি না, কিন্তু যদি আমি এটি কোডে আসি, আমি ভয় পাব না।"