এক্সেপশান হ্যান্ডেলিং: চলুন আরও একটু গভীরভাবে পর্যবেক্ষণ করি

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

শুরুতে একটি টার্ম সম্পর্কে পরিচয় করিয়ে দিই - Fault-tolerant

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

মনে করা যাক – আমাদের দেশে একটা সময় প্রতি ঘণ্টায় একবার করে চলে পাওয়ার যেত। এখন যদি কোন সিস্টেম তৈরি করি যা পাওয়ার এর উপর নির্ভরশীল, তাহলে যাখন পাওয়ার থাকবে না, তখন সিস্টিমটি কাজ করবে না। এজন্যে আমরা বিকল্প ব্যবস্থা হিসেবে জেনারেটর রাখতে পারি, যাতে করে যখন মেইন পাওয়ার লাইন থাকবে না, তখন জেনারেটরের মাধ্যমে আমাদের সিস্টেমটি চলতে থাকবে। এই সিস্টেমটিকে আমরা তখন ফল্ট টলারেন্ট সিস্টেম বলবো।

তো আমাদের এই টপিক এর উদ্দেশ্য হচ্ছে আমরা কিভাবে ফল্ট টলারেন্ট জাভা প্রোগ্রাম লিখতে পারি।

শুরুতে আমরা একটি প্রোগ্রাম দেখি যাতে একসেপশান হ্যান্ডেলিং ব্যবহার করা হয় নি।

নিচের প্রোগ্রামটি রান করুন-

public class DivideByZeroNoExceptionHandling {
    public static int divide(int a, int b) {
        return a / b;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Please enter an integer: ");
        int a = scanner.nextInt();
        System.out.println("Please enter another integer: ");
        int b = scanner.nextInt();

        int result = divide(a, b);

        System.out.println(String.format("Result: %d/%d = %d", a, b, result));
    }

}

Take 1

Please enter an integer: 
100
Please enter another integer: 
45
Result: 100/45 = 2

Take# 2

Please enter an integer: 
100
Please enter another integer: 
0
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.bazlur.tips.DivideByZeroNoExceptionHandling.divide(DivideByZeroNoExceptionHandling.java:11)
    at com.bazlur.tips.DivideByZeroNoExceptionHandling.main(DivideByZeroNoExceptionHandling.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
`

Take # 3

Please enter an integer: 
100
Please enter another integer: 
bazlur
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at com.bazlur.tips.DivideByZeroNoExceptionHandling.main(DivideByZeroNoExceptionHandling.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
`
  • Take #1 এ প্রোগ্রামটি খুব ভাল ভাবে রান করছে।
  • Take #2 তে ইনপুট হিসেবে শূণ্য দেওয়াতে আমাদের প্রোগ্রামটি ঠিকভাবে কাজ করেনি বরং অনেকগুলো লাইন প্রিন্ট করেছে।
  • Take #3 তে ইনপুন হিসেবে ইন্টিজার এর পরিবর্তে স্ট্রিং দেওয়ায় প্রোগ্রামটি কাজ করে নি, বরং অনেকগুলো লাইন প্রিন্ট করেছে যা কিনা বলছে ইনপুটি সঠিক হয় নি। এই লাইনগুলোর