1. ব্যতিক্রম

>

শেষ পর্যন্ত, প্রোগ্রামাররা ত্রুটি হ্যান্ডলিংকে মানসম্মত এবং স্বয়ংক্রিয় করার চিন্তা করেছিল। এটি ঘটেছিল যখন ব্যতিক্রমগুলি উদ্ভাবিত হয়েছিল। এখন ব্যতিক্রম প্রক্রিয়া 80% ব্যতিক্রমী পরিস্থিতি পরিচালনা করে।

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

যখন একটি জাভা প্রোগ্রামে একটি ত্রুটি ঘটে, যেমন দ্বারা বিভাজন 0, কিছু বিস্ময়কর জিনিস ঘটে:

প্রথম ধাপ

একটি বিশেষ ব্যতিক্রম অবজেক্ট তৈরি করা হয়েছে, যা ঘটে যাওয়া ত্রুটি সম্পর্কে তথ্য ধারণ করে।

জাভাতে সবকিছুই একটি অবজেক্ট, এবং ব্যতিক্রম কোন ব্যতিক্রম নয় 🙂 ব্যতিক্রম অবজেক্টের নিজস্ব ক্লাস আছে, এবং একমাত্র জিনিস যা তাদের সাধারণ ক্লাস থেকে আলাদা করে তা হল তারা ক্লাসের উত্তরাধিকারী Throwable

ধাপ দুই

ব্যতিক্রম বস্তুটি "নিক্ষেপ"। সম্ভবত এখানে শব্দ আরো ভাল হতে পারে. "একটি ব্যতিক্রম নিক্ষেপ" একটি ফায়ার অ্যালার্ম ট্রিগার বা "DEFCON 1" সতর্কতা বাজানোর মত।

যখন জাভা মেশিনে একটি ব্যতিক্রম নিক্ষেপ করা হয়, তখন প্রোগ্রামের স্বাভাবিক কাজ বন্ধ হয়ে যায় এবং "জরুরি প্রোটোকল" শুরু হয়।

ধাপ তিন

যে পদ্ধতিতে ব্যতিক্রমটি নিক্ষেপ করা হয়েছিল তা অবিলম্বে প্রস্থান করে। ব্যতিক্রমটি কলিং পদ্ধতিতে পাস করা হয়, যা অবিলম্বে প্রস্থান করে। mainএবং পদ্ধতিটি প্রস্থান না হওয়া পর্যন্ত চেইনের নিচে । যখন mainপদ্ধতিটি বন্ধ হয়ে যায়, তখন প্রোগ্রামটিও হয়।

উদাহরণ:

কোড কনসোল আউটপুট
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Your attention, please! Preparing for the end of the world");
      endTheWorld();
      System.out.println("The world ended successfully");
   }

   public static void endTheWorld()
   {
      System.out.println("We're doing something important");
      doSomeWork(0);
      System.out.println("Everything is working well");
   }

   public static void doSomeWork(int n)
   {
      System.out.println("Nothing terrible will happen: " + n);
      System.out.println(2 / n);
      System.out.println("Nothing terrible happened: " + n);
   }
}
Your attention, please! Preparing for the end of the world
We're doing something important
Nothing terrible will happen: 0

20 লাইনে একটি ব্যতিক্রম ঘটে: 0 দ্বারা বিভাজন। জাভা মেশিন অবিলম্বে একটি ব্যতিক্রম তৈরি করে — একটি ArithmeticExceptionবস্তু এবং এটিকে পদ্ধতিতে "নিক্ষেপ" করে।

পদ্ধতিটি divide()অবিলম্বে শেষ হয়ে যায়, তাই আমরা কখনই স্ট্রিংটি দেখতে পাই না: ভয়ানক কিছুই ঘটেনি: 0. প্রোগ্রামটি পদ্ধতিতে ফিরে আসে endTheWorld()এবং পরিস্থিতি নিজেই পুনরাবৃত্তি করে: সিস্টেমে একটি অনির্বাচিত ব্যতিক্রম রয়েছে, যার অর্থ হল পদ্ধতিটি endTheWorld()অস্বাভাবিকভাবে বন্ধ হয়ে যায়। তারপর mainপদ্ধতিটি বন্ধ হয়ে যায় এবং প্রোগ্রামটি বন্ধ হয়ে যায়।

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


2. ব্যতিক্রম ধরা:try-catch

জাভাতে একটি ব্যতিক্রম ধরার প্রক্রিয়া রয়েছে যা আপনাকে পদ্ধতির এই অস্বাভাবিক সমাপ্তি বন্ধ করতে দেয়। এটি এই মত দেখায়:

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}

এই গঠন একটি ব্লক বলা হয় try-catch.

কোড যেখানে ব্যতিক্রম ঘটতে পারে কোঁকড়া বন্ধনীতে মোড়ানো হয়, শব্দের পূর্বে try

কোঁকড়া ধনুর্বন্ধনীর পরে, আমাদের কাছে catchকীওয়ার্ড রয়েছে এবং বন্ধনীর ভিতরে, একটি ব্যতিক্রম পরিবর্তনশীলের ঘোষণা রয়েছে । এর পরে কোঁকড়া ধনুর্বন্ধনী দ্বারা অনুসরণ করা হয় যা নির্দিষ্ট প্রকারের ব্যতিক্রম ঘটলে কার্যকর করা কোডটিকে মোড়ানো হয়

যদি " প্রাথমিক কোড " কার্যকর করার সময় কোন ব্যতিক্রম না হয় , তাহলে ক্যাচ ব্লকের ভিতরের কোডটি কার্যকর করা হবে না। যদি একটি ব্যতিক্রম ঘটে, তবে তা হবে (যদি নিক্ষেপ করা ব্যতিক্রমের ধরন বন্ধনীতে ভেরিয়েবলের প্রকারের মতো হয়)।

উদাহরণ:

কোড কনসোল আউটপুট
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Hadron Collider launched");

      try
      {
         launchHadronCollider(1);
         launchHadronCollider(0);
      }
      catch(Exception e)
      {
         System.out.println("Error! Caught an exception");
         System.out.println("The planet was sucked into a black hole!");
      }

      System.out.println("The Hadron Collider stopped");
   }

   public static void launchHadronCollider(int n)
   {
      System.out.println("Everything is working well: " + n);
      System.out.println(2/n);
      System.out.println("There are no problems: " + n);
   }
}
Hadron Collider launched
Everything is working fine: 1
2
There are no problems: 1
Everything is working fine: 0
Error! Caught an exception
The planet has been sucked into a black hole!
The Hadron Collider is stopped


3. একাধিক catchব্লক

একাধিক ক্যাচ ব্লক

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

জাভা বিকাশকারীরা আপনাকে সাহায্য করার সিদ্ধান্ত নিয়েছে এবং আপনাকে ব্লকের catchপরে একটি নয় বরং অনেকগুলি ব্লক লিখতে দেবে।try

try
{
   // Code where an exception might occur
}
catch (ExceptionType1 name1)
{
   // Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
   // Code for handling ExceptionType2
}
   catch (ExceptionType3 name3)
{
   // Code for handling ExceptionType3
}

উদাহরণ:

কোড কনসোল আউটপুট
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch (ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method


catch4. ব্লকের ক্রম

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

কিন্তু ব্লকের ক্রম গুরুত্বপূর্ণ।

আপনার এমন পরিস্থিতি হতে পারে যেখানে একাধিক ব্লক দ্বারা একটি ব্যতিক্রম ধরা যেতে পারে। যদি তা হয়, তবে ব্যতিক্রমটি ধরা হবে যেটি ক্যাচ ব্লক প্রথমে আসে (ব্লকের সবচেয়ে কাছে try)।

আপনি কিভাবে একটি পরিস্থিতি যেখানে একাধিক ক্যাচ ব্লক একই ব্যতিক্রম ধরতে পারে?

সমস্ত ব্যতিক্রম একটি একক উত্তরাধিকার অনুক্রমের অন্তর্গত — চিত্রটি দেখুন।

ব্যতিক্রম শ্রেণিবিন্যাস

একটি ArithmeticExceptionঅবজেক্টকে একটি ভেরিয়েবলের জন্য বরাদ্দ করা যেতে পারে যার ধরন ArithmeticExceptionবা তার পূর্বপুরুষের যে কোনো ক্লাস: RuntimeException , Exceptionএবং Throwable— চিত্রটি দেখুন।

আমরা লেভেল 21-এ উত্তরাধিকার এবং পূর্বপুরুষ শ্রেণী সম্পর্কে আরও কথা বলব।

এই কোড ঠিক ঠিক কম্পাইল হবে:

উত্তরাধিকারের সুবিধা:
ArithmeticException ae    = new ArithmeticException();
RuntimeException runtime  = new ArithmeticException();
Exception exception       = new ArithmeticException();
Throwable trwbl           = new ArithmeticException();

সুতরাং আপনি উপরের ArithmeticException4টি ব্লকের যেকোনো একটি দিয়ে ধরতে পারেন ।catch

উদাহরণ 1:

কোড কনসোল আউটপুট
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method

এই উদাহরণে, এবং ব্লক ArithmeticExceptionউভয় দ্বারা ধরা যেতে পারে । এটি ব্লকের সবচেয়ে কাছের ব্লক দ্বারা ধরা হবে - প্রথম ব্লক।catch (Exception e)catch (ArithmeticException e)trycatch

বিস্ময় এড়াতে, ব্লকগুলির তালিকার শেষের কাছাকাছিcatch প্রায় প্রতিটি ব্যতিক্রম ধরতে পারে এমন ব্লকগুলি স্থাপন করা ভাল ।catch

টাইপটি সাধারণত জাভাতে সম্ভাব্য প্রতিটি ব্যতিক্রম ধরতেThrowable সক্ষম । আপনি যদি এটিকে প্রথম ব্লকে রাখেন, তাহলে কোডটি কম্পাইল হবে না, যেহেতু কম্পাইলার জানে যে কোডের অপাগ্য ব্লক রয়েছে।catch