জাভা প্রোগ্রামিং ভাষা এরর এবং অন্যান্য ব্যতিক্রমী ঘটনা হ্যান্ডেল করতে এক্সেপশন ব্যবহার করে।
এক্সেপশন হলো এমন একটি ঘটনা যা প্রোগ্রামের এক্সিকিউশনের সময় ঘটে এবং নির্দেশনার স্বাভাবিক প্রবাহ ব্যাহত করে। জাভায় এক্সেপশন স্পষ্টভাবে রেইজ করা হয়, আর একটি এক্সেপশন রেইজ করার কাজটিকে বলা হয় এক্সেপশন থ্রো করা। একটি এক্সেপশন হ্যান্ডেল করার কাজটিকে বলা হয় এক্সেপশন ক্যাচ করা।
জাভায় সব এক্সেপশন Exception ক্লাসের সাবক্লাস, আর Exception নিজেই Throwable-এর সাবক্লাস।
জাভা দুই ধরনের এক্সেপশন আলাদা করে:
চেকড এক্সেপশন হলো এমন ব্যতিক্রমী অবস্থা, যা একটি অ্যাপ্লিকেশনের আগেই অনুমান করা উচিত এবং যা থেকে তার রিকভার করা উচিত।
চেকড এক্সেপশনের একটি উদাহরণ হলো FileNotFoundException, যা ঘটে যখন একটি মেথড এমন একটি ফাইল পড়তে চায় যা নেই।
এই ধরনের এক্সেপশন কম্পাইল-টাইমে চেক করা হয়: যে মেথডগুলো চেকড এক্সেপশন থ্রো করে, তাদের মেথড সিগনেচারে এটি উল্লেখ করা উচিত, আর যে কোড এমন একটি মেথড কল করে যা হয়তো একটি চেকড এক্সেপশন থ্রো করতে পারে, তাকে অবশ্যই এটি হ্যান্ডেল করতে হবে, নাহলে কোডটি কম্পাইল হবে না।
সব চেকড এক্সেপশন Exception-এর সাবক্লাস, যারা RuntimeException এক্সটেন্ড করে না।
আনচেকড এক্সেপশন হলো এমন ব্যতিক্রমী অবস্থা, যা একটি অ্যাপ্লিকেশন সাধারণত আগে থেকে অনুমান করতে পারে না বা যা থেকে রিকভারও করতে পারে না।
আনচেকড এক্সেপশনের একটি উদাহরণ হলো NullPointerException, যা ঘটে যখন একটি মেথড একটি নন-নাল মান আশা করে কিন্তু null পায়।
এই ধরনের এক্সেপশন কম্পাইল-টাইমে চেক করা হয় না: যে মেথডগুলো আনচেকড এক্সেপশন থ্রো করে, তাদের মেথড সিগনেচারে এটি উল্লেখ করা আবশ্যক নয়, আর যে কোড এমন একটি মেথড কল করে যা হয়তো একটি আনচেকড এক্সেপশন থ্রো করতে পারে, তাকেও এটি হ্যান্ডেল করতে হয় না।
সব আনচেকড এক্সেপশন RuntimeException থেকে ইনহেরিট করে, যা নিজেই Exception-এর একটি এক্সটেনশন।
জাভায় একটি মেথড throw স্টেটমেন্ট ব্যবহার করে একটি এক্সেপশন থ্রো করতে পারে।
একটি মেথড থেকে চেকড এক্সেপশন থ্রো করার সময়, নিচের উদাহরণে দেখানো মতো throws কিওয়ার্ড ব্যবহার করে মেথড সিগনেচারে এটি উল্লেখ করা আবশ্যক।
এতে কল করা কোড বাধ্য হয় আগেই ধরে নিতে যে একটি এক্সেপশন থ্রো হতে পারে এবং সেই অনুযায়ী তা হ্যান্ডেল করতে।
public class InsufficientBalanceException extends Exception {
}
public class BankAccount {
public void withdraw(double amount) throws InsufficientBalanceException {
if (balance < amount) {
throw new InsufficientBalanceException();
}
// rest of the method implementation
}
}
একটি মেথড থেকে আনচেকড এক্সেপশন থ্রো করার সময়, মেথড সিগনেচারে এটি উল্লেখ করা আবশ্যক নয়, যদিও এটি সমর্থিত।
public class BankAccount {
public void withdraw(double amount) {
if (amount < 0) {
throw new IllegalArgumentException("Cannot withdraw a negative amount");
}
// rest of the method implementation
}
}
জাভায় এক্সেপশন হ্যান্ডেল করা হয় try, catch এবং finally কিওয়ার্ড দিয়ে।
try ব্লকে মোড়ানো উচিত।try ব্লকের পরে থাকে এক বা একাধিক catch ব্লক, যেগুলো try ব্লকে থ্রো হওয়া এক্সেপশনগুলো ক্যাচ করে।catch ব্লকগুলোর পরে ঐচ্ছিকভাবে থাকে একটি finally ব্লক, যা এক্সেপশন থ্রো হোক বা না হোক, try ব্লকের পরে সবসময় এক্সিকিউট হয়।নিচের উদাহরণে দেখা যায় এই কিওয়ার্ডগুলো কীভাবে কাজ করে:
public class ATM {
public void withdraw(BankAccount bankAccount, double amount) {
try {
System.out.println("Withdrawing " + amount);
bankAccount.withdraw(amount);
System.out.println("Withdrawal succeeded");
} catch (InsufficientBalanceException) {
System.out.println("Withdrawal failed: insufficient balance");
} catch (RuntimeException e) {
System.out.println("Withdrawal failed: " + e.getMessage());
} finally {
System.out.println("Current balance: " + bankAccount.getBalance());
}
}
}
এই উদাহরণে, যখন কোনো এক্সেপশন থ্রো হয় না, তখন নিচেরটি প্রিন্ট হয়:
Withdrawing 10.0
Withdrawal succeeded
Current balance: 5.0
তবে যদি bankAccount.withdraw(amount) স্টেটমেন্টটি একটি InsufficientBalanceException থ্রো করে, তাহলে নিচেরটি প্রিন্ট হয়:
Withdrawing 10.0
Withdrawal failed: insufficient balance
Current balance: 5.0
অথবা, যদি bankAccount.withdraw(amount) দ্বারা একটি আনচেকড এক্সেপশন থ্রো হয়, তাহলে নিচেরটি প্রিন্ট হয়:
Withdrawing -10.0
Withdrawal failed: Cannot withdraw a negative amount
Current balance: 5.0
জাভায় Errors নামে একটি আলাদা ক্যাটেগরিও আছে, যেগুলো অ্যাপ্লিকেশনের বাইরের গুরুতর সমস্যা।
একটি এররের উদাহরণ হলো OutOfMemoryError, যা ঘটে যখন একটি অ্যাপ্লিকেশন সিস্টেমে উপলব্ধ মেমোরির চেয়ে বেশি মেমোরি ব্যবহার করতে চায়।
আনচেকড এক্সেপশনের মতোই, এররগুলোও কম্পাইল-টাইমে চেক করা হয় না। পার্থক্য হলো এগুলো সিস্টেম-লেভেলের সমস্যা বোঝায় এবং সাধারণত অ্যাপ্লিকেশনের বদলে জাভা ভার্চুয়াল মেশিন বা এনভায়রনমেন্ট এগুলো থ্রো করে। অ্যাপ্লিকেশনগুলোর সাধারণত এগুলো ক্যাচ বা হ্যান্ডেল করার চেষ্টা করা উচিত নয়।
জাভায় সব এরর Error ক্লাস থেকে ইনহেরিট করে।
আগেই বলা হয়েছে, এক্সেপশন হলো এমন ঘটনা যা নির্দেশনার স্বাভাবিক প্রবাহ ব্যাহত করে, আর এগুলো ব্যতিক্রমী ঘটনা হ্যান্ডেল করতে ব্যবহৃত হয়। তাই আপনার অ্যাপ্লিকেশনে ফ্লো কন্ট্রোলের জন্য এক্সেপশন ব্যবহার করা সুপারিশ করা হয় না।