হ্যালো! আজকের পাঠে, আমরা জাভা ব্যতিক্রম সম্পর্কে কথা বলব। দৈনন্দিন জীবন এমন পরিস্থিতিতে পূর্ণ যা আমরা আশা করি না। উদাহরণস্বরূপ, আপনি সকালে কাজের জন্য উঠে আপনার ফোনের চার্জারটি খুঁজছেন, কিন্তু আপনি এটি কোথাও খুঁজে পাচ্ছেন না। আপনি স্নান করতে বাথরুমে যান শুধুমাত্র পাইপগুলি হিমায়িত আছে তা আবিষ্কার করতে। আপনি আপনার গাড়িতে উঠুন, কিন্তু এটি শুরু হবে না। একজন মানুষ খুব সহজেই এই ধরনের অপ্রত্যাশিত পরিস্থিতি মোকাবেলা করতে সক্ষম। এই নিবন্ধে, আমরা জাভা প্রোগ্রামগুলি কীভাবে তাদের সাথে কাজ করে তা খুঁজে বের করার চেষ্টা করব।
একটি প্রোগ্রামে ব্যতিক্রমী পরিস্থিতি প্রতিরোধ ও সমাধান করার ক্ষমতা, এটি চালিয়ে যেতে দেয়, জাভাতে ব্যতিক্রম ব্যবহার করার একটি কারণ। ব্যতিক্রম প্রক্রিয়াটি আপনাকে আপনার কোড (API) যেকোন ইনপুট যাচাই (পরীক্ষা) করে অনুপযুক্ত ব্যবহার থেকে রক্ষা করতে দেয়। এখন কল্পনা করুন যে আপনি এক সেকেন্ডের জন্য পরিবহন বিভাগ। প্রথমত, আপনাকে এমন জায়গাগুলি জানতে হবে যেখানে গাড়িচালকরা সমস্যার আশা করতে পারেন। দ্বিতীয়ত, আপনাকে সতর্কতা চিহ্ন তৈরি এবং ইনস্টল করতে হবে। এবং অবশেষে, প্রধান রুটে সমস্যা দেখা দিলে আপনাকে চক্কর প্রদান করতে হবে। জাভাতে, ব্যতিক্রম প্রক্রিয়া একইভাবে কাজ করে। বিকাশের সময়, আমরা কোডের বিপজ্জনক বিভাগগুলির চারপাশে একটি "ব্যতিক্রম বাধা" তৈরি করতে একটি চেষ্টা ব্লক ব্যবহার করি, আমরা একটি ক্যাচ ব্যবহার করে "ব্যাকআপ রুট" প্রদান করি {}ব্লক, এবং আমরা এমন কোড লিখি যা শেষ পর্যন্ত{} ব্লকে যাই হোক না কেন চালানো উচিত । যদি আমরা একটি "ব্যাকআপ রুট" প্রদান করতে না পারি বা আমরা ব্যবহারকারীকে বেছে নেওয়ার অধিকার দিতে চাই, তাহলে আমাদের অন্তত তাকে বিপদ সম্পর্কে সতর্ক করতে হবে। কেন? শুধু একজন চালকের ক্ষোভের কথা কল্পনা করুন যে, একটি সতর্কতা চিহ্ন না দেখে, একটি ছোট সেতুতে পৌঁছে যা সে অতিক্রম করতে পারে না! প্রোগ্রামিং-এ, আমাদের ক্লাস এবং পদ্ধতিগুলি লেখার সময়, আমরা সবসময় পূর্বাভাস দিতে পারি না যে সেগুলি অন্যান্য বিকাশকারীরা কীভাবে ব্যবহার করতে পারে। ফলস্বরূপ, আমরা একটি ব্যতিক্রমী পরিস্থিতি সমাধানের 100% সঠিক উপায়ের পূর্বাভাস দিতে পারি না। এটি বলেছে, ব্যতিক্রমী পরিস্থিতির সম্ভাবনা সম্পর্কে অন্যদের সতর্ক করা ভাল ফর্ম। জাভা এর ব্যতিক্রম প্রক্রিয়া আমাদের থ্রো দিয়ে এটি করতে দেয়কীওয়ার্ড - মূলত একটি ঘোষণা যে আমাদের পদ্ধতির সাধারণ আচরণের মধ্যে একটি ব্যতিক্রম নিক্ষেপ করা অন্তর্ভুক্ত। এইভাবে, পদ্ধতি ব্যবহার করে যে কেউ জানে যে তার ব্যতিক্রমগুলি পরিচালনা করতে কোড লিখতে হবে।
যখন একটি ব্যতিক্রম চেষ্টা ব্লকে নিক্ষেপ করা হয়, JVM পরবর্তী ক্যাচ ব্লকে একটি উপযুক্ত ব্যতিক্রম হ্যান্ডলারের সন্ধান করে। যদি একটি ক্যাচ ব্লকের প্রয়োজনীয় ব্যতিক্রম হ্যান্ডলার থাকে, তবে নিয়ন্ত্রণ এটির কাছে যায়। যদি তা না হয়, তাহলে উপযুক্ত হ্যান্ডলার না পাওয়া পর্যন্ত JVM ক্যাচ ব্লকের চেইনটি আরও নীচে দেখে। একটি ক্যাচ ব্লক কার্যকর করার পরে, নিয়ন্ত্রণ ঐচ্ছিক অবশেষে ব্লকে স্থানান্তরিত হয়। উপযুক্ত ক্যাচ হলেব্লক খুঁজে পাওয়া যায় না, তারপর JVM প্রোগ্রাম বন্ধ করে এবং স্ট্যাক ট্রেস (বর্তমান পদ্ধতি কলের স্ট্যাক) প্রদর্শন করে, যদি এটি বিদ্যমান থাকে তবে প্রথমে অবশেষে ব্লকটি সম্পাদন করার পরে। ব্যতিক্রম পরিচালনার উদাহরণ:
একটি জাভা ব্যতিক্রম কি?
প্রোগ্রামিং জগতে, একটি প্রোগ্রাম কার্যকর করার ক্ষেত্রে ত্রুটি এবং অপ্রত্যাশিত পরিস্থিতিকে ব্যতিক্রম বলা হয়। একটি প্রোগ্রামে, ব্যবহারকারীর অবৈধ ক্রিয়া, অপর্যাপ্ত ডিস্ক স্থান, বা সার্ভারের সাথে নেটওয়ার্ক সংযোগ হারানোর কারণে ব্যতিক্রম ঘটতে পারে। ব্যতিক্রমগুলি প্রোগ্রামিং ত্রুটি বা API এর ভুল ব্যবহারের ফলেও হতে পারে। বাস্তব জগতের মানুষের মতো নয়, একটি প্রোগ্রামকে অবশ্যই জানতে হবে যে এই পরিস্থিতিগুলি কীভাবে পরিচালনা করতে হয়। এর জন্য জাভাতে ব্যতিক্রম হ্যান্ডলিং নামে পরিচিত একটি ব্যবস্থা রয়েছে।কীওয়ার্ড সম্পর্কে কয়েকটি শব্দ
জাভাতে ব্যতিক্রম হ্যান্ডলিং প্রোগ্রামে নিম্নলিখিত কীওয়ার্ডগুলির ব্যবহারের উপর ভিত্তি করে:- চেষ্টা করুন - কোডের একটি ব্লক সংজ্ঞায়িত করে যেখানে একটি ব্যতিক্রম ঘটতে পারে;
- ধরা - কোডের একটি ব্লক সংজ্ঞায়িত করে যেখানে ব্যতিক্রমগুলি পরিচালনা করা হয়;
- পরিশেষে - কোডের একটি ঐচ্ছিক ব্লক সংজ্ঞায়িত করে যেটি, যদি উপস্থিত থাকে, চেষ্টা ব্লকের ফলাফল নির্বিশেষে কার্যকর করা হয়।
- নিক্ষেপ - একটি ব্যতিক্রম বাড়াতে ব্যবহৃত;
- থ্রোস - পদ্ধতিটি একটি ব্যতিক্রম নিক্ষেপ করতে পারে সতর্ক করার জন্য পদ্ধতি স্বাক্ষরে ব্যবহৃত হয়।
// This method reads a string from the keyboard
public String input() throws MyException { // Use throws to warn
// that the method may throw a MyException
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = null;
// We use a try block to wrap code that might create an exception. In this case,
// the compiler tells us that the readLine() method in the
// BufferedReader class might throw an I/O exception
try {
s = reader.readLine();
// We use a catch block to wrap the code that handles an IOException
} catch (IOException e) {
System.out.println(e.getMessage());
// We close the read stream in the finally block
} finally {
// An exception might occur when we close the stream if, for example, the stream was not open, so we wrap the code in a try block
try {
reader.close();
// Handle exceptions when closing the read stream
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
if (s.equals("")) {
// We've decided that an empty string will prevent our program from working properly. For example, we use the result of this method to call the substring(1, 2) method. Accordingly, we have to interrupt the program by using throw to generate our own MyException exception type.
throw new MyException("The string cannot be empty!");
}
return s;
}
কেন আমরা ব্যতিক্রম প্রয়োজন?
বাস্তব জগত থেকে একটি উদাহরণ তাকান. কল্পনা করুন যে হাইওয়ের একটি অংশে সীমিত ওজন ক্ষমতা সহ একটি ছোট সেতু রয়েছে। সেতুর সীমার চেয়ে ভারী একটি গাড়ি যদি এটির উপর দিয়ে চলে যায় তবে এটি ভেঙে যেতে পারে। ড্রাইভারের জন্য পরিস্থিতি হয়ে উঠবে, এটিকে হালকাভাবে বললে, ব্যতিক্রমী। এটি এড়াতে, পরিবহন বিভাগ কিছু ভুল হওয়ার আগেই রাস্তায় সতর্কতা সংকেত স্থাপন করে। সতর্কীকরণ চিহ্ন দেখে একজন চালক তার গাড়ির ওজনকে সেতুর সর্বোচ্চ ওজনের সাথে তুলনা করেন। যানবাহন খুব ভারী হলে, চালক একটি বাইপাস পথ নেয়। পরিবহন বিভাগ, প্রথমত, ট্রাক চালকদের প্রয়োজনে তাদের রুট পরিবর্তন করা সম্ভব করে তোলে, দ্বিতীয়ত, প্রধান সড়কের বিপদ সম্পর্কে চালকদের সতর্ক করে এবং তৃতীয়ত, ড্রাইভারদের সতর্ক করে যে নির্দিষ্ট শর্তে সেতুটি ব্যবহার করা উচিত নয়।
"সমস্যা" সম্পর্কে অন্যদের সতর্ক করা
আপনি যদি আপনার পদ্ধতিতে ব্যতিক্রমগুলি পরিচালনা করার পরিকল্পনা না করেন তবে অন্যদের সতর্ক করতে চান যে ব্যতিক্রম ঘটতে পারে, তাহলে থ্রোস কীওয়ার্ডটি ব্যবহার করুন। মেথড সিগনেচারের এই কীওয়ার্ডটির অর্থ হল, কিছু শর্তের অধীনে, পদ্ধতিটি ব্যতিক্রম হতে পারে। এই সতর্কতাটি মেথড ইন্টারফেসের অংশ এবং এর ব্যবহারকারীদের তাদের নিজস্ব ব্যতিক্রম হ্যান্ডলিং লজিক প্রয়োগ করতে দেয়। নিক্ষেপ করার পরে, আমরা নিক্ষেপ করা ব্যতিক্রমগুলির ধরন নির্দিষ্ট করি। এগুলি সাধারণত জাভা এর ব্যতিক্রম ক্লাস থেকে আসে। যেহেতু জাভা একটি অবজেক্ট-ওরিয়েন্টেড ল্যাঙ্গুয়েজ, সব ব্যতিক্রমই জাভাতে অবজেক্ট।
ব্যতিক্রম শ্রেণিবিন্যাস
যখন একটি প্রোগ্রাম চলাকালীন একটি ত্রুটি ঘটে, তখন JVM জাভা ব্যতিক্রম শ্রেণিবিন্যাস থেকে উপযুক্ত ধরণের একটি বস্তু তৈরি করে — সম্ভাব্য ব্যতিক্রমগুলির একটি সেট যা একটি সাধারণ পূর্বপুরুষ থেকে আসে — থ্রোয়েবল ক্লাস । আমরা ব্যতিক্রমী রানটাইম পরিস্থিতি দুটি গ্রুপে ভাগ করতে পারি:- যে পরিস্থিতি থেকে প্রোগ্রাম পুনরুদ্ধার করতে পারে না এবং স্বাভাবিক কাজ চালিয়ে যেতে পারে।
- পরিস্থিতি যেখানে পুনরুদ্ধার সম্ভব।
একটি ব্যতিক্রম তৈরি করা
যখন একটি প্রোগ্রাম চালানো হয়, JVM দ্বারা বা ম্যানুয়ালি একটি থ্রো স্টেটমেন্ট ব্যবহার করে ব্যতিক্রমগুলি তৈরি করা হয়। যখন এটি ঘটে, মেমরিতে একটি ব্যতিক্রম বস্তু তৈরি হয়, প্রোগ্রামের প্রধান প্রবাহ বাধাপ্রাপ্ত হয়, এবং JVM এর ব্যতিক্রম হ্যান্ডলার ব্যতিক্রমটি পরিচালনা করার চেষ্টা করে।ব্যতিক্রম হ্যান্ডলিং
জাভাতে, আমরা কোড ব্লক তৈরি করি যেখানে আমরা try{}catch , try{}catch{}finally , এবং চেষ্টা{}finally{} কনস্ট্রাক্ট ব্যবহার করে ব্যতিক্রম পরিচালনার প্রয়োজন অনুমান করি।
public class Print {
void print(String s) {
if (s == null) {
throw new NullPointerException("Exception: s is null!");
}
System.out.println("Inside print method: " + s);
}
public static void main(String[] args) {
Print print = new Print();
List list= Arrays.asList("first step", null, "second step");
for (String s : list) {
try {
print.print(s);
}
catch (NullPointerException e) {
System.out.println(e.getMessage());
System.out.println("Exception handled. The program will continue");
}
finally {
System.out.println("Inside finally block");
}
System.out.println("The program is running...");
System.out.println("-----------------");
}
}
}
এখানে প্রধান পদ্ধতির ফলাফল আছে :
Inside print method: first step
Inside finally block
The program is running...
-----------------
Exception: s is null!
Exception handled. The program will continue
Inside finally block
The program is running...
-----------------
Inside print method: second step
Inside finally block
The program is running...
-----------------
পরিশেষে সাধারণত কোন স্ট্রীম বন্ধ করতে এবং চেষ্টা ব্লকে খোলা/বরাদ্দ করা যেকোন রিসোর্স মুক্ত করতে ব্যবহৃত হয়। যাইহোক, একটি প্রোগ্রাম লেখার সময়, সমস্ত সংস্থান বন্ধের ট্র্যাক রাখা সবসময় সম্ভব নয়। আমাদের জীবনকে সহজ করার জন্য, জাভার ডেভেলপাররা ট্রাই-উথ-রিসোর্স কনস্ট্রাক্ট অফার করে, যা ট্রাই ব্লকে খোলা যেকোনো রিসোর্স স্বয়ংক্রিয়ভাবে বন্ধ করে দেয়। আমাদের প্রথম উদাহরণটি রিসোর্স দিয়ে চেষ্টা করে পুনরায় লেখা যেতে পারে :
public String input() throws MyException {
String s = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
s = reader.readLine();
} catch (IOException e) {
System.out.println(e.getMessage());
}
if (s.equals("")) {
throw new MyException ("The string cannot be empty!");
}
return s;
}
সংস্করণ 7 এ প্রবর্তিত জাভা ক্ষমতার জন্য ধন্যবাদ, আমরা ভিন্ন ভিন্ন ব্যতিক্রমগুলিকে একটি ব্লকে একত্রিত করতে পারি, কোডটিকে আরও কমপ্যাক্ট এবং পঠনযোগ্য করে তোলে। উদাহরণ:
public String input() {
String s = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
s = reader.readLine();
if (s.equals("")) {
throw new MyException("The string cannot be empty!");
}
} catch (IOException | MyException e) {
System.out.println(e.getMessage());
}
return s;
}
GO TO FULL VERSION