1. ব্যতিক্রম
>
শেষ পর্যন্ত, প্রোগ্রামাররা ত্রুটি হ্যান্ডলিংকে মানসম্মত এবং স্বয়ংক্রিয় করার চিন্তা করেছিল। এটি ঘটেছিল যখন ব্যতিক্রমগুলি উদ্ভাবিত হয়েছিল। এখন ব্যতিক্রম প্রক্রিয়া 80% ব্যতিক্রমী পরিস্থিতি পরিচালনা করে।
যদি কিছু পণ্ডিত ব্যতিক্রম নিয়ে আসেন, তবে এটি সম্ভবত তার ডক্টরেট গবেষণার বিষয় ছিল। যদি একজন প্রোগ্রামার এটি নিয়ে আসেন, তাহলে তিনি একজন সহকর্মীর কাছ থেকে পিঠে একটি বন্ধুত্বপূর্ণ প্যাট পেতে পারেন: "ঠিক আছে, ভাই।"
যখন একটি জাভা প্রোগ্রামে একটি ত্রুটি ঘটে, যেমন দ্বারা বিভাজন 0
, কিছু বিস্ময়কর জিনিস ঘটে:
প্রথম ধাপ
একটি বিশেষ ব্যতিক্রম অবজেক্ট তৈরি করা হয়েছে, যা ঘটে যাওয়া ত্রুটি সম্পর্কে তথ্য ধারণ করে।
জাভাতে সবকিছুই একটি অবজেক্ট, এবং ব্যতিক্রম কোন ব্যতিক্রম নয় 🙂 ব্যতিক্রম অবজেক্টের নিজস্ব ক্লাস আছে, এবং একমাত্র জিনিস যা তাদের সাধারণ ক্লাস থেকে আলাদা করে তা হল তারা ক্লাসের উত্তরাধিকারী Throwable
।
ধাপ দুই
ব্যতিক্রম বস্তুটি "নিক্ষেপ"। সম্ভবত এখানে শব্দ আরো ভাল হতে পারে. "একটি ব্যতিক্রম নিক্ষেপ" একটি ফায়ার অ্যালার্ম ট্রিগার বা "DEFCON 1" সতর্কতা বাজানোর মত।
যখন জাভা মেশিনে একটি ব্যতিক্রম নিক্ষেপ করা হয়, তখন প্রোগ্রামের স্বাভাবিক কাজ বন্ধ হয়ে যায় এবং "জরুরি প্রোটোকল" শুরু হয়।
ধাপ তিন
যে পদ্ধতিতে ব্যতিক্রমটি নিক্ষেপ করা হয়েছিল তা অবিলম্বে প্রস্থান করে। ব্যতিক্রমটি কলিং পদ্ধতিতে পাস করা হয়, যা অবিলম্বে প্রস্থান করে। main
এবং পদ্ধতিটি প্রস্থান না হওয়া পর্যন্ত চেইনের নিচে । যখন main
পদ্ধতিটি বন্ধ হয়ে যায়, তখন প্রোগ্রামটিও হয়।
উদাহরণ:
কোড | কনসোল আউটপুট |
---|---|
|
|
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
কীওয়ার্ড রয়েছে এবং বন্ধনীর ভিতরে, একটি ব্যতিক্রম পরিবর্তনশীলের ঘোষণা রয়েছে । এর পরে কোঁকড়া ধনুর্বন্ধনী দ্বারা অনুসরণ করা হয় যা নির্দিষ্ট প্রকারের ব্যতিক্রম ঘটলে কার্যকর করা কোডটিকে মোড়ানো হয় ।
যদি " প্রাথমিক কোড " কার্যকর করার সময় কোন ব্যতিক্রম না হয় , তাহলে ক্যাচ ব্লকের ভিতরের কোডটি কার্যকর করা হবে না। যদি একটি ব্যতিক্রম ঘটে, তবে তা হবে (যদি নিক্ষেপ করা ব্যতিক্রমের ধরন বন্ধনীতে ভেরিয়েবলের প্রকারের মতো হয়)।
উদাহরণ:
কোড | কনসোল আউটপুট |
---|---|
|
|
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
}
উদাহরণ:
কোড | কনসোল আউটপুট |
---|---|
|
|
catch
4. ব্লকের ক্রম
একটি ব্লকে ঘটে এমন ব্যতিক্রমগুলি try
শুধুমাত্র একটি catch
ব্লক দ্বারা ধরা যেতে পারে। আপনার একটি ব্যতিক্রম হ্যান্ডলিং পরিস্থিতি থাকতে পারে না যেখানে একাধিক ব্লকের কোডটি catch
কার্যকর হয়।
কিন্তু ব্লকের ক্রম গুরুত্বপূর্ণ।
আপনার এমন পরিস্থিতি হতে পারে যেখানে একাধিক ব্লক দ্বারা একটি ব্যতিক্রম ধরা যেতে পারে। যদি তা হয়, তবে ব্যতিক্রমটি ধরা হবে যেটি ক্যাচ ব্লক প্রথমে আসে (ব্লকের সবচেয়ে কাছে try
)।
আপনি কিভাবে একটি পরিস্থিতি যেখানে একাধিক ক্যাচ ব্লক একই ব্যতিক্রম ধরতে পারে?
সমস্ত ব্যতিক্রম একটি একক উত্তরাধিকার অনুক্রমের অন্তর্গত — চিত্রটি দেখুন।
একটি ArithmeticException
অবজেক্টকে একটি ভেরিয়েবলের জন্য বরাদ্দ করা যেতে পারে যার ধরন ArithmeticException
বা তার পূর্বপুরুষের যে কোনো ক্লাস: RuntimeException
, Exception
এবং Throwable
— চিত্রটি দেখুন।
আমরা লেভেল 21-এ উত্তরাধিকার এবং পূর্বপুরুষ শ্রেণী সম্পর্কে আরও কথা বলব।
এই কোড ঠিক ঠিক কম্পাইল হবে:
উত্তরাধিকারের সুবিধা: |
---|
|
সুতরাং আপনি উপরের ArithmeticException
4টি ব্লকের যেকোনো একটি দিয়ে ধরতে পারেন ।catch
উদাহরণ 1:
কোড | কনসোল আউটপুট |
---|---|
|
|
এই উদাহরণে, এবং ব্লক ArithmeticException
উভয় দ্বারা ধরা যেতে পারে । এটি ব্লকের সবচেয়ে কাছের ব্লক দ্বারা ধরা হবে - প্রথম ব্লক।catch (Exception e)
catch (ArithmeticException e)
try
catch
বিস্ময় এড়াতে, ব্লকগুলির তালিকার শেষের কাছাকাছিcatch
প্রায় প্রতিটি ব্যতিক্রম ধরতে পারে এমন ব্লকগুলি স্থাপন করা ভাল ।catch
টাইপটি সাধারণত জাভাতে সম্ভাব্য প্রতিটি ব্যতিক্রম ধরতেThrowable
সক্ষম । আপনি যদি এটিকে প্রথম ব্লকে রাখেন, তাহলে কোডটি কম্পাইল হবে না, যেহেতু কম্পাইলার জানে যে কোডের অপাগ্য ব্লক রয়েছে।catch
GO TO FULL VERSION