কম্পিউটার

জাভা ব্যতিক্রম এবং সেগুলি কীভাবে পরিচালনা করবেন

একজন জাভা বিকাশকারী হিসাবে, আপনার জাভা ব্যতিক্রম এবং ব্যতিক্রম পরিচালনা সম্পর্কে ভাল জ্ঞান থাকা উচিত।

এই টিউটোরিয়ালটি প্রাথমিক জ্ঞান প্রদান করে যা জাভা প্রোগ্রামের সাথে কাজ করার সময় প্রতিটি প্রোগ্রামারকে অবশ্যই থাকতে হবে। শুরু করতে, জাভা ব্যতিক্রমগুলি ঠিক কী তা বোঝার সাথে শুরু করা যাক।

জাভা ব্যতিক্রম কি

একটি জাভা প্রোগ্রাম সমস্যায় পড়তে পারে যার ফলে প্রোগ্রামটি কার্যকর করার সময় হঠাৎ করে বন্ধ হয়ে যায়। এই সমস্যাগুলিকে ব্যতিক্রম বলা হয়৷

একজন ভাল প্রোগ্রামার কার্যকর করার সময় যে ত্রুটিগুলি ঘটতে পারে তা চিনতে সক্ষম হওয়া উচিত এবং এই ধরনের ব্যতিক্রমের ক্ষেত্রে প্রোগ্রাম গ্রহণের জন্য বিকল্প রুট প্রদান করা উচিত। এই অনুশীলনকে বলা হয় ব্যতিক্রম পরিচালনা।

এখন আপনি ভাবছেন কেন আমাদের ব্যতিক্রম হ্যান্ডলিং দরকার। কেন এমন প্রোগ্রামগুলি লিখবেন না যা ব্যতিক্রম ছুঁড়বে না?

কেন আমাদের ব্যতিক্রম হ্যান্ডলিং প্রয়োজন

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

ব্যবহারকারীর ইনপুট গ্রহণকারী প্রোগ্রামগুলি ব্যবহারকারীর দেওয়া একটি অবৈধ ইনপুটের কারণে ব্যতিক্রম হওয়ার ঝুঁকিতে থাকে। সুতরাং বহিরাগত ফাইলগুলি পড়ার সম্ভাবনা বিবেচনা করে যে সেগুলি প্রোগ্রামারের অজান্তেই বাইরের উত্স দ্বারা সরানো, নাম পরিবর্তন করা বা মুছে ফেলা হয়েছে৷

এই ধরনের ক্ষেত্রে, প্রোগ্রামটি অবশ্যই এক্সিকিউশন বন্ধ না করেই ব্যতিক্রমটি সুন্দরভাবে পরিচালনা করতে সক্ষম হবে।

জাভা ব্যতিক্রমগুলির শ্রেণিবিন্যাস

জাভাতে সমস্ত ব্যতিক্রম Exception-এর সন্তান হওয়া উচিত ক্লাস, যেটি নিজেই Throwable এর সন্তান ক্লাস।

Exception এর দুটি প্রধান উপশ্রেণী ক্লাস হল RuntimeException এবং IOException .

ব্যতিক্রম বনাম ত্রুটি

Throwable এর আরেকটি চাইল্ড ক্লাস ক্লাস হল Error ক্লাস যাইহোক, ত্রুটি ব্যতিক্রম থেকে ভিন্ন।

ত্রুটিগুলি নির্দেশ করে যে সমস্যাগুলি JVM কার্যকর করার সময় চলতে পারে। এই সমস্যাগুলি সাধারণত গুরুতর এবং অপরিবর্তনীয়। মেমরি ফাঁস এবং লাইব্রেরি অসঙ্গতি সমস্যা প্রোগ্রামে ত্রুটির জন্য সাধারণ কারণ।

StackOverflowError এবং OutOfMemoryError জাভা ত্রুটির দুটি উদাহরণ।

চেক করা এবং চেক করা ব্যতিক্রমগুলি

আমরা জাভা ব্যতিক্রমগুলিকে দুটি প্রধান বিভাগে ভাগ করতে পারি:চেক করা এবং আনচেক করা হয়েছে ব্যতিক্রম।

চেক করা ব্যতিক্রমগুলি হল ব্যতিক্রম যা কম্পাইল করার আগে প্রোগ্রামে পরিচালনা করতে হবে। যদি এই ব্যতিক্রমগুলি পরিচালনা না করা হয়, তবে প্রোগ্রামটি জাভা কম্পাইলার দ্বারা কম্পাইল করা হবে না। অতএব, এগুলিকে কম্পাইল-টাইম ব্যতিক্রমও বলা হয়। IOExceptions চেক করা ব্যতিক্রমগুলির ভাল উদাহরণ।

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

RuntimeException প্রসারিত সমস্ত ক্লাস ক্লাস আনচেক ব্যতিক্রম। এই ধরনের ক্লাসের দুটি উদাহরণ হল NullPointerException এবং ArrayIndexOutOfBoundsException .

ব্যতিক্রম ক্লাসে সাধারণভাবে ব্যবহৃত পদ্ধতি

আমরা জাভা Exception-এ কয়েকটি সাধারণভাবে ব্যবহৃত পদ্ধতির মধ্য দিয়ে যাব ক্লাস:

  1. getMessage :ঘটে যাওয়া ব্যতিক্রমের বিবরণ সম্বলিত একটি বার্তা ফেরত দেয়।
  2. printStackTrace :ব্যতিক্রম ঘটেছে স্ট্যাক ট্রেস ফেরত দেয়।
  3. toString :ক্লাসের নাম এবং getMessage দিয়ে ফেরত পাঠানো বার্তাটি ফেরত দেয় পদ্ধতি।

কিভাবে ব্যতিক্রমগুলি পরিচালনা করবেন

আসুন দেখি কিভাবে আমরা জাভাতে ব্যতিক্রমগুলি পরিচালনা করতে পারি:

ট্রাই-ক্যাচ

আমরা ব্যতিক্রমগুলি ধরতে পারি এবং একটি চেষ্টা-ক্যাচ ব্যবহার করে সঠিকভাবে পরিচালনা করতে পারি জাভাতে ব্লক করুন।

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

ট্রাই-ক্যাচ ব্লকের মৌলিক সিনট্যাক্স নিম্নরূপ:

try {
    //exception-prone code
}
catch(Exception e) {
    //error handling logic
}

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

আমরা দেখব কিভাবে IOExceptions পরিচালনা করতে হয় FileReader দ্বারা নিক্ষিপ্ত একটি জাভা প্রোগ্রামে ক্লাস।

উদাহরণ:

import java.io.FileReader;

public class TryCatchBlockExample {

    public static void main(String[] args) {

        try {
            FileReader file = new FileReader("source.txt");
            file.read();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

এখানে, আমরা FileNotFoundException পরিচালনা করতে একটি একক ক্যাচ ব্লক ব্যবহার করেছি FileReader ইনস্ট্যান্ট করার সময় নিক্ষেপ করা হয় ক্লাস এবং IOException read() দ্বারা নিক্ষিপ্ত FileReader এর পদ্ধতি ক্লাস।

এই ব্যতিক্রম উভয়ই Exception এর সন্তান ক্লাস।

আমরা একাধিক ক্যাচ স্টেটমেন্টও ব্যবহার করতে পারি সিঙ্গেল ট্রাই স্টেটমেন্টের ভিতরে কোড দ্বারা নিক্ষিপ্ত বিভিন্ন ধরনের ত্রুটি ধরতে। আগের উদাহরণের জন্য, আমরা FileNotFoundException ধরতে একটি ক্যাচ ব্লক ব্যবহার করতে পারি এবং IOException এর জন্য আরেকটি ক্যাচ ব্লক নিম্নলিখিত কোড স্নিপেট দেখায়:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatchBlockExample {

    public static void main(String[] args) {

        try {
            FileReader file = new FileReader("source.txt");
            file.read();
            file.close();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }
}

যদি নিক্ষেপ করা ব্যতিক্রমটি প্রথম ক্যাচ স্টেটমেন্ট দ্বারা পরিচালিত ব্যতিক্রমের সাথে মেলে, তবে এটি প্রথম ক্যাচ স্টেটমেন্টের ভিতরে যুক্তি দ্বারা পরিচালিত হয়।

যদি ব্যতিক্রমগুলি মেলে না, তবে এটি দ্বিতীয় ক্যাচ স্টেটমেন্টে চলে যায়। যদি দুটির বেশি ক্যাচ স্টেটমেন্ট থাকে, তবে এই প্রক্রিয়াটি অব্যাহত থাকে যতক্ষণ না ব্যতিক্রমটি একটি ক্যাচ স্টেটমেন্টে পৌঁছায় যা তার ধরণকে ধরে রাখে।

যেহেতু FileNotFoundException IOException এর একটি উপপ্রকার , একটি FileNotFoundException ধরতে ২য় ক্যাচ স্টেটমেন্ট ব্যবহার করে কাজ করবে না। এটি প্রথম ক্যাচ স্টেটমেন্ট দ্বারা পরিচালিত হবে এবং কখনই ২য় স্টেটমেন্টে পৌঁছাবে না।

দ্রষ্টব্য:একটি চেষ্টা বিবৃতি সহ কমপক্ষে একটি ক্যাচ স্টেটমেন্ট ব্যবহার করা বাধ্যতামূলক।

অবশেষে

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

তারপর, finally এর ভিতরের কোড একটি ব্যতিক্রম ঘটবে বা না হোক বিবৃতি বাস্তবায়িত হয়। finally স্টেটমেন্ট সবসময় ট্রাই-ক্যাচ-ফাইনালি ব্লকের শেষে আসা উচিত।

উদাহরণস্বরূপ, যখন আমরা FileReader ব্যবহার করি ক্লাস একটি ফাইল পড়ার জন্য, একটি ব্যতিক্রম ঘটবে বা না হোক প্রক্রিয়াকরণ শেষে খোলা ফাইলটি বন্ধ করা অপরিহার্য। এটি নিশ্চিত করার জন্য, আমরা finally ফাইলটি বন্ধ করার জন্য কোডটি রাখতে পারি বিবৃতি।

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatchFinallyBlockExample {

    public static void main(String[] args) {
        FileReader file = null;
        try {
            file = new FileReader("source.txt");
            file.read();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        finally {
            file.close();
        }
    }
}

যাইহোক, যদি আপনি উপরের কোডটি কম্পাইল করার চেষ্টা করেন, তাহলে একটি আন-হ্যান্ডেল করা IOException এর কারণে কোডটি কম্পাইল করা হবে না। . এর কারণ হল close() FileReader এর পদ্ধতি ক্লাস IOExceptionsও ফেলতে পারে . সুতরাং, আমাদের এই অংশটিকে অন্য একটি ট্রাই ব্লকের ভিতরে রাখতে হবে:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatchFinallyBlockExample {

    public static void main(String[] args) {
        FileReader file = null;

        try {
            file = new FileReader("source.txt");
            file.read();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                file.close();
            }
            catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}

থ্রো

throws ব্যবহার করে ত্রুটিগুলি পরিচালনা করা জাভাতে কীওয়ার্ড সহজ। প্রকৃতপক্ষে, এই পদ্ধতিতে, আপনি যে জায়গায় এটি ঘটে সেখানে ব্যতিক্রমটি সত্যিই পরিচালনা করবেন না। পরিবর্তে, আমরা বর্তমান পদ্ধতির ব্যতিক্রমটিকে সেই পদ্ধতিতে ফেলে দিই যাকে বর্তমান পদ্ধতি বলা হয়। তারপরে, ত্রুটি হস্তান্তর করা বাইরের পদ্ধতির দায়িত্ব হয়ে যায়।

একটি পদ্ধতির বাইরে একটি ব্যতিক্রম নিক্ষেপ করার জন্য, আপনাকে কেবল ঘোষণা করতে হবে যে এই পদ্ধতিটি বিবেচিত ব্যতিক্রমটি নিক্ষেপ করতে পারে। দেখা যাক কিভাবে আমরা IOExceptions পরিচালনা করতে পারি FileReader দ্বারা নিক্ষিপ্ত ক্লাস এই পদ্ধতি ব্যবহার করে।

উদাহরণ:

import java.io.FileReader;
import java.io.IOException;

public class ThrowsExample {

    public void readFile throws IOException {
        FileReader file = new FileReader("source.txt");
        file.read();
        file.close();
    }
}

নিক্ষেপ

এই তালিকার অন্যান্য পদ্ধতির বিপরীতে, throws কীওয়ার্ড ত্রুটি পরিচালনা করতে ব্যবহার করা হয় না. কিন্তু যেহেতু অধিকাংশ মানুষ throws কে বিভ্রান্ত করে throws সহ কীওয়ার্ড কীওয়ার্ড, আমরা মনে করি এটি এখানে আলোচনা করা ভাল হবে৷

throws কীওয়ার্ডটি স্পষ্টভাবে একটি ব্যতিক্রম আহ্বান করতে ব্যবহৃত হয়। আমরা একটি নতুন তাত্ক্ষণিক ব্যতিক্রম বা একটি ব্যতিক্রম নিক্ষেপ করতে পারি যা পদ্ধতির ভিতরে ধরা পড়েছিল৷

public class ThrowExample {

    public void invalidate(int amount) throws Exception {
        if (amount < 500) {
            throw new Exception("Amount not sufficient");
        }
    }
}

ব্যবহারকারী-সংজ্ঞায়িত ব্যতিক্রম

অন্তর্নির্মিত জাভা ব্যতিক্রমগুলি ব্যবহার করার পাশাপাশি, আপনি নিজের ব্যতিক্রমগুলি সংজ্ঞায়িত করতে পারেন। আপনি তাদের হয় চেক করা বা আনচেক করা ব্যতিক্রম হিসাবে সংজ্ঞায়িত করতে পারেন। একটি নতুন চেক করা ব্যতিক্রম তৈরি করতে, আপনার নতুন ব্যতিক্রমকে Exception প্রসারিত করা উচিত ক্লাস।

একটি আনকেকড তৈরি করতে ব্যতিক্রম, RuntimeException প্রসারিত করুন ক্লাস।

নিম্নলিখিত কোড উদাহরণে, আমরা একটি ব্যবহারকারী-সংজ্ঞায়িত চেক ব্যতিক্রম তৈরি করেছি:

public class InvalidLengthException extends Exception {
    private int length;
    private String message;

    public InvalidLengthException(int length, String message) {
        this.length=length;
        this.message=message;
    }

    public int getAmount() {
        return this.length;
    }

    public String getMessage() {
        return this.message;
    }
}

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

public class InputChecker {

    private int minLength;
    private int maxLength;

    public InputChecker(int minLength, int maxLength) {
        this.minLength=minLength;
        this.maxLength=maxLength;
    }

    public void checkStringLength(String strInput) throws InvalidLengthException {
        int strLength = strInput.length();
        if (strLength < minLength) {
            throw new InvalidLengthException(strLength, "Input should have minimum "+minLength+" characters");
        }
        else if (strLength > maxLength){
            throw new InvalidLengthException(strLength, "Input should have maximum "+maxLength+" character");
        }
    }
}

যদি আমরা InputChecker ব্যবহার করে একটি স্ট্রিংয়ের দৈর্ঘ্য পরীক্ষা করি ক্লাস, এটি একটি InvalidLengthException নিক্ষেপ করবে যদি স্ট্রিং দৈর্ঘ্য সর্বনিম্ন দৈর্ঘ্যের নিচে বা সর্বোচ্চ দৈর্ঘ্যের উপরে হয়।

public class Main {

    public static void main(String[] args) {
        InputChecker ic = new InputChecker(2, 7);
        try {
            ic.checkStringLength("longer than the maximum length");
        }
        catch(InvalidLengthException e) {
            e.printStackTrace();
        }
    }
}

যখন আমরা উপরের কোড স্নিপেট চালাই, তখন এটি একটি InvalidLengthException নিক্ষেপ করবে এবং আমরা নিম্নলিখিত আউটপুট পাব:

InvalidLengthException: Input should have maximum 7 character
    at InputChecker.checkStringLength(InputChecker.java:17)
    at Main.main(Main.java:6)

উপসংহার

এই টিউটোরিয়ালে, আমরা আপনাকে জাভা ব্যতিক্রমগুলির একটি দ্রুত এবং সংক্ষিপ্ত ভূমিকা দিয়েছি। আমরা আশা করি যে আপনি এখন আপনার জাভা প্রোগ্রামে ব্যতিক্রমগুলি কী এবং কীভাবে সেগুলি পরিচালনা করবেন সে সম্পর্কে ভাল ধারণা পেয়েছেন৷


  1. কিভাবে জাভা একটি ব্যতিক্রম নিক্ষেপ

  2. কিভাবে JSP একটি ব্যতিক্রম পরিচালনা করবেন?

  3. কিভাবে ব্যতিক্রমগুলি C++ এ কাজ করে

  4. জাভাতে ArrayStoreException (আনচেক করা) কীভাবে পরিচালনা করবেন?