Java प्रोग्रामिंग भाषा एरर और अन्य असामान्य घटनाओं को संभालने के लिए एक्सेप्शन का उपयोग करती है।
एक्सेप्शन एक ऐसी घटना है जो किसी प्रोग्राम के चलने के दौरान होती है और निर्देशों के सामान्य प्रवाह को बाधित करती है। Java में एक्सेप्शन स्पष्ट रूप से फेंके जाते हैं, और किसी एक्सेप्शन को फेंकने की क्रिया को एक्सेप्शन फेंकना कहा जाता है। किसी एक्सेप्शन को संभालने की क्रिया को एक्सेप्शन पकड़ना कहा जाता है।
Java में सभी एक्सेप्शन Exception क्लास की सबक्लास होते हैं। Exception क्लास खुद Throwable की सबक्लास है।
Java दो प्रकार के एक्सेप्शन में अंतर करती है:
चेक्ड एक्सेप्शन ऐसी असामान्य स्थितियाँ हैं जिनका किसी एप्लिकेशन को पहले से अनुमान लगाना चाहिए और जिनसे उसे उबरना चाहिए।
चेक्ड एक्सेप्शन का एक उदाहरण FileNotFoundException है, जो तब होता है जब कोई मेथड ऐसी फाइल पढ़ने की कोशिश कर रहा हो जो मौजूद नहीं है।
इस प्रकार के एक्सेप्शन की जाँच कंपाइल टाइम पर होती है। जो मेथड चेक्ड एक्सेप्शन फेंकते हैं, उन्हें अपने मेथड सिग्नेचर में यह बताना चाहिए। और जो कोड ऐसे मेथड को कॉल करता है जो चेक्ड एक्सेप्शन फेंक सकता है, उसे उस एक्सेप्शन को संभालना ज़रूरी है, वरना कोड कंपाइल नहीं होगा।
सभी चेक्ड एक्सेप्शन Exception क्लास की सबक्लास होते हैं, पर RuntimeException की नहीं।
अनचेक्ड एक्सेप्शन ऐसी असामान्य स्थितियाँ हैं जिनका आम तौर पर किसी एप्लिकेशन के लिए अनुमान लगाना या जिनसे उबरना संभव नहीं होता।
अनचेक्ड एक्सेप्शन का एक उदाहरण NullPointerException है, जो तब होता है जब कोई मेथड ऐसी वैल्यू की अपेक्षा कर रहा हो जो null न हो, लेकिन उसे null मिल जाए।
इस प्रकार के एक्सेप्शन की जाँच कंपाइल टाइम पर नहीं होती। जो मेथड अनचेक्ड एक्सेप्शन फेंकते हैं, उन्हें अपने मेथड सिग्नेचर में यह बताना ज़रूरी नहीं है। और जो कोड ऐसे मेथड को कॉल करता है जो अनचेक्ड एक्सेप्शन फेंक सकता है, उसे उस एक्सेप्शन को संभालना ज़रूरी नहीं है।
सभी अनचेक्ड एक्सेप्शन RuntimeException से उत्तराधिकार प्राप्त करते हैं, जो खुद Exception का विस्तार है।
Java में एक मेथड 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
}
}
Java में एक्सेप्शन संभालने का काम 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
Java में एरर नाम की एक अलग श्रेणी भी है, जो गंभीर समस्याएँ हैं और किसी एप्लिकेशन से बाहर की हैं।
एरर का एक उदाहरण OutOfMemoryError है, जो तब होता है जब कोई एप्लिकेशन सिस्टम पर जितनी मेमरी उपलब्ध है उससे ज़्यादा मेमरी इस्तेमाल करने की कोशिश कर रहा हो।
अनचेक्ड एक्सेप्शन की तरह, एरर की भी जाँच कंपाइल टाइम पर नहीं होती। अंतर यह है कि ये सिस्टम स्तर की समस्याओं को दर्शाती हैं और आम तौर पर एप्लिकेशन के बजाय Java वर्चुअल मशीन या वातावरण द्वारा फेंकी जाती हैं। एप्लिकेशन को आम तौर पर इन्हें पकड़ने या संभालने की कोशिश नहीं करनी चाहिए।
Java में सभी एरर Error क्लास से उत्तराधिकार प्राप्त करती हैं।
जैसा कि पहले कहा गया, एक्सेप्शन ऐसी घटनाएँ हैं जो निर्देशों के सामान्य प्रवाह को बाधित करती हैं, और इनका उपयोग असामान्य घटनाओं को संभालने के लिए किया जाता है। इसलिए आपके एप्लिकेशन में फ्लो कंट्रोल के लिए एक्सेप्शन का उपयोग करने की सलाह नहीं दी जाती।