CodeGym /Java Blog /এলোমেলো /ব্যতিক্রম: চেক করা, আনচেক করা এবং কাস্টম
John Squirrels
লেভেল 41
San Francisco

ব্যতিক্রম: চেক করা, আনচেক করা এবং কাস্টম

এলোমেলো দলে প্রকাশিত
ওহে! শেষ পাঠে, আমরা জাভা ভাষার ব্যতিক্রমগুলির সাথে পরিচিত হয়েছি, এবং কীভাবে তাদের সাথে কাজ করতে হয় তার উদাহরণ দেখেছি। আজ আমরা ব্যতিক্রমগুলির কাঠামোর উপর গভীরভাবে নজর দেব, এবং কীভাবে আমাদের নিজস্ব ব্যতিক্রমগুলি লিখতে হয় তা শিখব :)

ব্যতিক্রমের ধরন

আমরা আগেই বলেছি, জাভাতে অনেক ব্যতিক্রম আছে, প্রায় 400! কিন্তু তারা সবাই দলে বিভক্ত, তাই তাদের মনে রাখা মোটামুটি সহজ। এটি এইভাবে দেখায়: ব্যতিক্রম: চেক করা, আনচেক করা, এবং কাস্টম - 2 সমস্ত ব্যতিক্রমের ক্লাসে একটি সাধারণ পূর্বপুরুষ রয়েছে Throwable। দুটি প্রধান গ্রুপ এটি থেকে উদ্ভূত হয়েছে: ব্যতিক্রম ( ব্যতিক্রম ) এবং ত্রুটি ( ত্রুটি )। ত্রুটি - এটি জাভা ভার্চুয়াল মেশিনের অপারেশন সম্পর্কিত একটি গুরুত্বপূর্ণ রান-টাইম ত্রুটি উপস্থাপন করে। বেশিরভাগ ক্ষেত্রে, ত্রুটি পরিচালনা করার প্রয়োজন হয় না, কারণ এটি কোডে কিছু গুরুতর ত্রুটি নির্দেশ করে। এর মধ্যে সবচেয়ে বিখ্যাত হল StackOverflowError (এটি ঘটে, উদাহরণস্বরূপ, যখন একটি পদ্ধতি নিজেকে অবিরামভাবে কল করে) এবং OutOfMemoryError(নতুন বস্তু তৈরি করার জন্য পর্যাপ্ত মেমরি না থাকলে এটি ঘটে)। আপনি দেখতে পাচ্ছেন, এই পরিস্থিতিতে, সাধারণত রান টাইমে পরিচালনা করার জন্য একেবারে কিছুই নেই: কোডটি কেবল ভুলভাবে লেখা হয়েছে এবং পুনরায় কাজ করা দরকার। ব্যতিক্রম - এটি উপস্থাপন করে, ভাল, একটি ব্যতিক্রম: একটি ব্যতিক্রমী, অপরিকল্পিত পরিস্থিতি যা প্রোগ্রামটি চলাকালীন ঘটে। এগুলি ত্রুটির মতো গুরুতর নয়, তবে সেগুলি এখনও আমাদের মনোযোগের প্রয়োজন৷ সমস্ত ব্যতিক্রম 2 প্রকারে বিভক্ত: চেক করা এবং আনচেক করাব্যতিক্রম: চেক করা, আনচেক করা, এবং কাস্টম - 3 সমস্ত চেক করা ব্যতিক্রমগুলি ক্লাস থেকে প্রাপ্ত Exception। "চেক করা" মানে কি? আমরা শেষ পাঠে এটির ইঙ্গিত করেছি: "জাভা কম্পাইলার তাই সবচেয়ে সাধারণ ব্যতিক্রমগুলি এবং সেগুলি ঘটতে পারে এমন পরিস্থিতিতে জানে।" উদাহরণস্বরূপ, এটি জানে যে যদি কোডটি একটি ফাইল থেকে ডেটা পড়ে, তাহলে ফাইলটি সহজেই বিদ্যমান থাকতে পারে না। এবং এমন অনেক পরিস্থিতি রয়েছে (যা এটি অনুমান করতে পারে)। তদনুসারে, কম্পাইলার এই সম্ভাব্য ব্যতিক্রমগুলির উপস্থিতির জন্য আমাদের কোড আগে থেকেই পরীক্ষা করে। যদি এটি তাদের খুঁজে পায়, তবে আমরা সেগুলি পরিচালনা না করা বা পুনরায় নিক্ষেপ না করা পর্যন্ত এটি কোডটি কম্পাইল করবে না। দ্বিতীয় প্রকারের ব্যতিক্রম হল "আনচেক করা"। তারা ক্লাস থেকে উদ্ভূত হয় RuntimeException. কিভাবে তারা চেক করা ব্যতিক্রম থেকে ভিন্ন? এটা থেকে উদ্ভূত বিভিন্ন শ্রেণীর প্রচুর আছে বলে মনে হচ্ছেRuntimeException(যা রানটাইম ব্যতিক্রম বর্ণনা করে) পার্থক্য হল যে কম্পাইলার এই ত্রুটিগুলি অনুমান করে না। এটা বলে মনে হচ্ছে, "কোডটি লেখার সময়, আমি সন্দেহজনক কিছু খুঁজে পাইনি, কিন্তু এটি চালানোর সময় কিছু ভুল হয়েছে। দৃশ্যত, কোডটিতে ত্রুটি রয়েছে!" এবং সত্যিই এই সত্য. আনচেক করা ব্যতিক্রমগুলি প্রায়শই প্রোগ্রামার ত্রুটির ফলাফল। এবং কম্পাইলার স্পষ্টতই প্রতিটি সম্ভাব্য খারাপ পরিস্থিতি ভবিষ্যদ্বাণী করতে পারে না যে লোকেরা তাদের নিজের হাতে তৈরি করতে পারে। :) অতএব, এটি আমাদের কোডে এই ধরনের ব্যতিক্রমগুলি পরিচালনা করা হয় কিনা তা পরীক্ষা করে না। আপনি ইতিমধ্যে বেশ কয়েকটি অচেক করা ব্যতিক্রমের সম্মুখীন হয়েছেন:
  • শূন্য দ্বারা ভাগ করলে একটি পাটিগণিত ব্যতিক্রম ঘটে
  • একটি ArrayIndexOutOfBoundsException ঘটে যখন আপনি অ্যারের বাইরে একটি অবস্থান অ্যাক্সেস করার চেষ্টা করেন।
অবশ্যই, আপনি কল্পনা করতে পারেন যে জাভা এর নির্মাতারা বাধ্যতামূলক ব্যতিক্রম হ্যান্ডলিং চালু করতে পারে, তবে এই ক্ষেত্রে কোডটি খুব জটিল হবে। যেকোন ডিভিশন অপারেশনের জন্য, আপনি ভুলবশত শূন্য দিয়ে ভাগ করেছেন কিনা তা পরীক্ষা করার জন্য আপনাকে একটি ব্লক লিখতে হবে try-catch? try-catchযে কোনো সময় আপনি একটি অ্যারে অ্যাক্সেস করেন, আপনার সূচকটি সীমার বাইরে ছিল কিনা তা পরীক্ষা করার জন্য আপনাকে একটি ব্লক লিখতে হবে । সবকিছুই স্প্যাগেটি কোড হবে এবং সম্পূর্ণ অপঠনযোগ্য হবে। এটা বোঝায় যে এই ধারণাটি পরিত্যাগ করা হয়েছে। ফলস্বরূপ, অচেক করা ব্যতিক্রমগুলি ব্লকগুলিতে পরিচালনা করার try-catchবা পুনরায় নিক্ষেপ করার প্রয়োজন নেই (যদিও এটি প্রযুক্তিগতভাবে সম্ভব, ত্রুটির মতো)।

কিভাবে আপনার নিজের ব্যতিক্রম নিক্ষেপ

অবশ্যই, জাভার নির্মাতারা প্রোগ্রামগুলিতে উদ্ভূত প্রতিটি ব্যতিক্রমী পরিস্থিতির পূর্বাভাস দিতে পারে না। পৃথিবীতে অনেকগুলি প্রোগ্রাম রয়েছে এবং সেগুলি খুব বৈচিত্র্যময়। তবে এটি নিয়ে উদ্বিগ্ন হওয়ার কিছু নেই, কারণ প্রয়োজনে আপনি নিজের ব্যতিক্রম তৈরি করতে পারেন। এটি করা খুব সহজ। আপনাকে যা করতে হবে তা হল আপনার নিজের ক্লাস তৈরি করা। আপনার নিশ্চিত হওয়া উচিত যে এর নাম "ব্যতিক্রম" দিয়ে শেষ হয়েছে। কম্পাইলারের এটির প্রয়োজন নেই, তবে আপনার কোড পড়ার অন্যান্য প্রোগ্রামাররা অবিলম্বে বুঝতে পারবে যে এটি একটি ব্যতিক্রম ক্লাস। উপরন্তু, নির্দেশ করুন যে ক্লাসটি Exceptionক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয়েছে (কম্পাইলারের এটি প্রয়োজন)। উদাহরণস্বরূপ, ধরুন আমাদের একটি Dogক্লাস আছে। আমরা ব্যবহার করে কুকুর হাঁটতে পারেনwalk()পদ্ধতি কিন্তু সেটা করার আগে আমাদের দেখতে হবে যে আমাদের পোষা প্রাণীটি কলার, লেশ এবং মুখবন্ধ পরছে কিনা। যদি এই গিয়ারের কোনোটি অনুপস্থিত থাকে, আমরা আমাদের নিজস্ব ব্যতিক্রম নিক্ষেপ করি: DogIsNotReadyException । এর কোড এই মত দেখায়:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
ক্লাসটি একটি ব্যতিক্রম তা নির্দেশ করার জন্য, আপনাকে ক্লাসের নামের পরে " এক্সটেন্ড এক্সেপশন " লিখতে হবে (এর মানে "বর্গটি ব্যতিক্রম ক্লাস থেকে উদ্ভূত হয়েছে")। কনস্ট্রাক্টরে, আমরা কেবল Exceptionস্ট্রিং বার্তা সহ ক্লাস কনস্ট্রাক্টরকে কল করি (যদি ব্যতিক্রম ঘটে, আমরা ব্যবহারকারীকে বার্তাটি, ত্রুটির একটি বিবরণ দেখাব)। আমাদের ক্লাস কোডে এটি কেমন দেখায় তা এখানে:

public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;


   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
এখন আমাদের walk()পদ্ধতি একটি DogIsNotReadyException নিক্ষেপ করে । এটি কীওয়ার্ড থ্রো দিয়ে করা হয়। আমরা আগেই বলেছি, ব্যতিক্রম একটি বস্তু। সুতরাং, যখন আমাদের পদ্ধতিতে একটি ব্যতিক্রম ঘটে (কুকুরটি কিছু অনুপস্থিত) তখন আমরা একটি নতুন DogIsNotReadyExceptionবস্তু তৈরি করি এবং কীওয়ার্ড থ্রো ব্যবহার করে এটি নিক্ষেপ করি। আমরা মেথড ডিক্লেয়ারেশনে " থ্রোস ডগআইসনটরেডিএক্সেপশন " যোগ করি। অন্য কথায়, এখন কম্পাইলার সচেতন যে walk()পদ্ধতিটিকে কল করা একটি ব্যতিক্রমী পরিস্থিতিতে পরিণত হতে পারে। তদনুসারে, এই ব্যতিক্রমটি পরিচালনা করা আবশ্যক যদি আমরা আমাদের প্রোগ্রামের কোথাও এই পদ্ধতিটি কল করি। আসুন পদ্ধতিতে এটি করার চেষ্টা করি main():

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
এই কম্পাইল করা হবে না. ব্যাতিক্রম সামাল দেওয়া হয় না! try-catchব্যতিক্রম পরিচালনা করতে আমরা আমাদের কোডটি একটি ব্লকে মোড়ানো করি :

public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
এখন কনসোল আউটপুট তাকান: কলার চালু আছে! মুখ বন্ধ! আমরা হাঁটার জন্য প্রস্তুত হচ্ছে! বন্ধু হাঁটার জন্য প্রস্তুত নয়! গিয়ার চেক করুন! গিয়ার চেক করছে! কলার অন আছে? খাঁজ কি সত্য? মিথ্যা মুখ কি? কনসোল আউটপুট আরও কত তথ্যপূর্ণ ছিল তা দেখুন ! আমরা প্রোগ্রামের প্রতিটি পদক্ষেপ দেখি; আমরা দেখি কোথায় ত্রুটি ঘটেছে, এবং আমরা অবিলম্বে দেখতে পারি যে আমাদের কুকুরটি কী অনুপস্থিত। :) এবং এভাবেই আপনি নিজের ব্যতিক্রম তৈরি করেন। আপনি দেখতে পাচ্ছেন, এটি সম্পর্কে জটিল কিছু নেই। এবং যদিও জাভা এর নির্মাতারা দুর্বলভাবে সজ্জিত কুকুরের জন্য একটি বিশেষ ব্যতিক্রম ভাষাতে অন্তর্ভুক্ত করতে বিরক্ত করেননি, আমরা তাদের তত্ত্বাবধান ঠিক করেছি। :)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION