हम इस ट्यूटोरियल में सीखने वाले है कि जावा एक्सेप्शन्स (Java Exceptions in Hindi) और हम इसे कैसे इस्तमाल कर सकते हैं? एक Exception या असाधारण घटना एक समस्या है जो किसी प्रोग्राम के Execution के दौरान उत्पन्न होती है। जब कोई Exception होता है तो प्रोग्राम का सामान्य प्रवाह बाधित होता है और प्रोग्राम/एप्लीकेशन असामान्य रूप से समाप्त हो जाता है, जिसकी अनुशंसा नहीं की जाती है, इसलिए इन Exception को संभाला जाना चाहिए।
Table of Contents
कई अलग-अलग कारणों से Exception हो सकता है। निम्नलिखित कुछ परिदृश्य हैं जहां एक Exception होता है।
- एक उपयोगकर्ता ने एक अमान्य डेटा दर्ज किया है।
- एक फ़ाइल जिसे खोलने की आवश्यकता है, नहीं मिल सकती है।
- संचार के बीच में एक नेटवर्क कनेक्शन खो गया है या जेवीएम मेमोरी से बाहर चला गया है।
इनमें से कुछ Exception उपयोगकर्ता Error के कारण होते हैं, अन्य प्रोग्रामर Error के कारण, और अन्य Physical resources के कारण होते हैं जो किसी तरह विफल हो जाते हैं।
इनके आधार पर, हमारे पास Exception की तीन श्रेणियां हैं। जावा में एक्सेप्शन हैंडलिंग कैसे काम करती है, यह जानने के लिए आपको उन्हें समझने की जरूरत है।
- चेक किए गए Exception (Checked exceptions) – एक चेक किया गया Exception एक Exception है जिसे संकलन-समय पर कंपाइलर द्वारा चेक (अधिसूचित) किया जाता है, इन्हें संकलन समय Exception भी कहा जाता है। इन Exception को आसानी से अनदेखा नहीं किया जा सकता है, प्रोग्रामर को इन Exception का ध्यान रखना चाहिए।
उदाहरण के लिए, यदि आप किसी फ़ाइल से डेटा पढ़ने के लिए अपने प्रोग्राम में FileReader वर्ग का उपयोग करते हैं, यदि उसके कंस्ट्रक्टर में निर्दिष्ट फ़ाइल मौजूद नहीं है, तो FileNotFoundException होती है, और कंपाइलर प्रोग्रामर को Exception को संभालने के लिए संकेत देता है।
Example
import java.io.File;
import java.io.FileReader;
public class FilenotFound_Demo {
public static void main(String args[]) {
File file = new File(“E://file.txt”);
FileReader fr = new FileReader(file);
}
}
यदि आप उपरोक्त प्रोग्राम को संकलित करने का प्रयास करते हैं, तो आपको निम्नलिखित Exception मिलेंगे।
Output
C:\>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
FileReader fr = new FileReader(file);
^
1 error
नोट − चूँकि FileReader क्लास के रीड () और क्लोज़ () तरीके IOException को फेंकते हैं, आप देख सकते हैं कि कंपाइलर IOException को संभालने के लिए FileNotFoundException के साथ सूचित करता है।
- अनियंत्रित Exception (Unchecked exceptions) – एक अनियंत्रित Exception एक Exception है जो निष्पादन के समय होता है। इन्हें रनटाइम Exception भी कहा जाता है। इनमें प्रोग्रामिंग बग शामिल हैं, जैसे लॉजिक एरर या एपीआई का अनुचित उपयोग। संकलन के समय रनटाइम Exception को अनदेखा कर दिया जाता है।
उदाहरण के लिए, यदि आपने अपने प्रोग्राम में आकार 5 की सरणी घोषित की है, और सरणी के 6 वें तत्व को कॉल करने का प्रयास कर रहे हैं तो एक ArrayIndexOutOfBoundsExceptionException होती है।
Example
public class Unchecked_Demo {
public static void main(String args[]) {
int num[] = {1, 2, 3, 4};
System.out.println(num[5]);
}
}
यदि आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं, तो आपको निम्न Exception मिलेगा।
Output
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 5
at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)
- Errors − ये बिल्कुल भी Exception नहीं हैं, बल्कि ऐसी समस्याएं हैं जो उपयोगकर्ता या प्रोग्रामर के नियंत्रण से परे उत्पन्न होती हैं। आपके कोड में Errorयों को आम तौर पर अनदेखा कर दिया जाता है क्योंकि आप किसी Error के बारे में शायद ही कुछ कर सकते हैं। उदाहरण के लिए, यदि स्टैक ओवरफ़्लो होता है, तो एक Error उत्पन्न होगी। संकलन के समय भी उनकी उपेक्षा की जाती है।
एक्सेप्शन हायरार्की (Exception Hierarchy in Hindi)
सभी Exception वर्ग java.lang.Exception वर्ग के उपप्रकार हैं। Exception वर्ग थ्रोएबल वर्ग का एक उपवर्ग है। Exception वर्ग के अलावा Error नामक एक और उपवर्ग है जो कि थ्रोएबल वर्ग से लिया गया है।
Errorयाँ असामान्य स्थितियाँ हैं जो गंभीर विफलताओं के मामले में होती हैं, इन्हें जावा प्रोग्राम द्वारा नियंत्रित नहीं किया जाता है। रनटाइम पर्यावरण द्वारा उत्पन्न Errorयों को इंगित करने के लिए Error उत्पन्न होती हैं। उदाहरण: जेवीएम मेमोरी से बाहर है। आम तौर पर, प्रोग्राम Errorयों से ठीक नहीं हो सकते हैं।
Exception वर्ग के दो मुख्य उपवर्ग हैं: IOException वर्ग और रनटाइम Exception वर्ग।
जावा के बिल्ट-इन Exception में से सबसे सामान्य चेक किए गए और अनचेक किए गए Exception की सूची निम्नलिखित है।
एक्सेप्शन्स मेथड्स (Exceptions Methods in Hindi)
थ्रोएबल क्लास में उपलब्ध महत्वपूर्ण विधियों की सूची निम्नलिखित है।
Sr.No. | Method & Description |
1 | public String getMessage() जो Exception हुआ है उसके बारे में एक विस्तृत संदेश लौटाता है। यह मैसेज थ्रोएबल कंस्ट्रक्टर में इनिशियलाइज़ किया गया है। |
2 | public Throwable getCause() फेंकने योग्य वस्तु द्वारा दर्शाए गए Exception का कारण देता है। |
3 | public String toString() GetMessage () के परिणाम के साथ श्रेणीबद्ध वर्ग का नाम लौटाता है। |
4 | public void printStackTrace()त्रुटि आउटपुट स्ट्रीम System.err पर स्टैक ट्रेस के साथ toString() का परिणाम प्रिंट करता है। |
5 | public StackTraceElement [] getStackTrace() स्टैक ट्रेस पर प्रत्येक तत्व वाली एक सरणी देता है। सूचकांक 0 पर तत्व कॉल स्टैक के शीर्ष का Representation करता है, और सरणी में अंतिम तत्व कॉल स्टैक के नीचे विधि का Representation करता है। |
6 | public Throwable fillInStackTrace() इस थ्रोएबल ऑब्जेक्ट के स्टैक ट्रेस को वर्तमान स्टैक ट्रेस के साथ भरता है, स्टैक ट्रेस में किसी भी पिछली जानकारी को जोड़ता है। |
catch एक्सेप्शन्स (Catching Exceptions in Hindi)
एक विधि कोशिश और catch कीवर्ड के संयोजन का उपयोग करके एक Exception को पकड़ती है। कोड के चारों ओर एक कोशिश/पकड़ Block रखा गया है जो Exception उत्पन्न कर सकता है। Try/catch Block के भीतर कोड को प्रोटेक्टेड कोड कहा जाता है, और Try/catch का उपयोग करने के लिए सिंटैक्स निम्न जैसा दिखता है –
Syntax
try {
// Protected code
} catch (ExceptionName e1) {
// Catch block
}
वह कोड जो Exception से ग्रस्त है, को कोशिश Block में रखा गया है। जब कोई Exception होता है, तो उस Exception को उसके साथ जुड़े catch Block द्वारा नियंत्रित किया जाता है। हर कोशिश Block के तुरंत बाद या तो catch Block या अंत में Block होना चाहिए।
एक catch स्टेटमेंट में उस प्रकार के Exception की घोषणा करना शामिल है जिसे आप पकड़ने की कोशिश कर रहे हैं। यदि संरक्षित कोड में कोई Exception होता है, तो कोशिश के बाद आने वाले catch Block (या Block) की जाँच की जाती है। यदि जिस प्रकार का Exception हुआ है, वह catch Block में सूचीबद्ध है, तो Exception को catch Block में पास कर दिया जाता है, क्योंकि एक तर्क को एक विधि पैरामीटर में पारित किया जाता है।
उदाहरण
निम्नलिखित 2 तत्वों के साथ घोषित एक सरणी है। फिर कोड सरणी के तीसरे तत्व तक पहुंचने का प्रयास करता है जो Exception throws है।
// File Name : ExcepTest.java
import java.io.*;
public class ExcepTest {
public static void main(String args[]) {
try {
int a[] = new int[2];
System.out.println(“Access element three :” + a[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(“Exception thrown :” + e);
}
System.out.println(“Out of the block”);
}
}
यह निम्नलिखित परिणाम देगा –
Output
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block
मल्टीपल catch Block (Multiple Catch Blocks in Hindi)
एक कोशिश Block के बाद कई catch Block हो सकते हैं। एकाधिक catch Block के लिए सिंटैक्स निम्न जैसा दिखता है –
Syntax
try {
// Protected code
} catch (ExceptionType1 e1) {
// Catch block
} catch (ExceptionType2 e2) {
// Catch block
} catch (ExceptionType3 e3) {
// Catch block
}
पिछले कथन तीन catch Block प्रदर्शित करते हैं, लेकिन आप एक ही प्रयास के बाद उनमें से किसी भी संख्या को प्राप्त कर सकते हैं। यदि संरक्षित कोड में कोई Exception होता है, तो Exception को सूची में पहले catch Block में फेंक दिया जाता है। यदि Exception का डेटा प्रकार Exception टाइप 1 से मेल खाता है, तो यह वहां पकड़ा जाता है। यदि नहीं, तो Exception दूसरे catch स्टेटमेंट में चला जाता है। यह तब तक जारी रहता है जब तक कि Exception या तो पकड़ा नहीं जाता है या सभी catch के माध्यम से गिर जाता है, जिस स्थिति में वर्तमान विधि निष्पादन बंद कर देती है और Exception को कॉल स्टैक पर पिछली विधि में फेंक दिया जाता है।
उदाहरण
यहां कोड सेगमेंट दिखाया गया है कि एकाधिक कोशिश/पकड़ने वाले बयानों का उपयोग कैसे करें।
try {
file = new FileInputStream(fileName);
x = (byte) file.read();
} catch (IOException i) {
i.printStackTrace();
return -1;
} catch (FileNotFoundException f) // Not valid! {
f.printStackTrace();
return -1;
}
एकाधिक प्रकार के Exception को पकड़ना (Catching Multiple Type of Exceptions)
जावा 7 के बाद से, आप एक catch Block का उपयोग करके एक से अधिक Exception को संभाल सकते हैं, यह सुविधा कोड को सरल बनाती है। यहां बताया गया है कि आप इसे कैसे करेंगे-
catch (IOException|FileNotFoundException ex) {
logger.log(ex);
throw ex;
थ्रो/थ्रो कीवर्ड्स (The Throws/Throw Keywords in Hindi)
यदि कोई विधि चेक किए गए Exception को नहीं संभालती है, तो विधि को इसे फेंके गए कीवर्ड का उपयोग करके घोषित करना चाहिए। किसी विधि के हस्ताक्षर के अंत में throws कीवर्ड प्रकट होता है।
आप एक Exception फेंक सकते हैं, या तो एक नया तात्कालिक एक या एक Exception जिसे आपने अभी-अभी पकड़ा है, फेंक कीवर्ड का उपयोग करके।
थ्रो और थ्रो कीवर्ड के बीच के अंतर को समझने की कोशिश करें, थ्रो का उपयोग चेक किए गए Exception की हैंडलिंग को स्थगित करने के लिए किया जाता है और थ्रो का उपयोग स्पष्ट रूप से Exception को आमंत्रित करने के लिए किया जाता है।
निम्न विधि घोषित करती है कि यह RemoteException throws है –
Example
import java.io.*;
public class className {
public void deposit(double amount) throws RemoteException {
// Method implementation
throw new RemoteException();
}
// Remainder of class definition
}
एक विधि यह घोषित कर सकती है कि यह एक से अधिक Exception को throws है, जिस स्थिति में Exception को अल्पविराम से अलग सूची में घोषित किया जाता है। उदाहरण के लिए, निम्न विधि घोषित करती है कि यह एक RemoteException और एक अपर्याप्त फंड Exception को throws है
Example
import java.io.*;
public class className {
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException {
// Method implementation
}
// Remainder of class definition
}
अंत में Block (The Finally Block in Hindi)
अंत में Block Try Block या catch Block का अनुसरण करता है। Exception की घटना के बावजूद कोड का अंत में Block हमेशा निष्पादित होता है।
अंत में Block का उपयोग करने से आप किसी भी क्लीनअप-टाइप स्टेटमेंट को चलाने की अनुमति देते हैं जिसे आप निष्पादित करना चाहते हैं, चाहे संरक्षित कोड में कुछ भी हो।
catch Block के अंत में अंत में एक Block दिखाई देता है और इसमें निम्नलिखित सिंटैक्स होता है –
Syntax
try {
// Protected code
} catch (ExceptionType1 e1) {
// Catch block
} catch (ExceptionType2 e2) {
// Catch block
} catch (ExceptionType3 e3) {
// Catch block
}finally {
// The finally block always executes.
}
Example
public class ExcepTest {
public static void main(String args[]) {
int a[] = new int[2];
try {
System.out.println(“Access element three :” + a[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(“Exception thrown :” + e);
}finally {
a[0] = 6;
System.out.println(“First element value: ” + a[0]);
System.out.println(“The finally statement is executed”);
}
}
}
यह निम्नलिखित परिणाम देगा –
Output
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed
निम्नलिखित पर ध्यान दें –
- एक कोशिश बयान के बिना एक catch क्लॉज मौजूद नहीं हो सकता।
- जब भी कोई कोशिश/पकड़ Block मौजूद होता है तो अंत में खंड होना अनिवार्य नहीं है।
- Try Block बिना catch क्लॉज या फाइनली क्लॉज के मौजूद नहीं हो सकता।
- Try, catch, finally block के बीच कोई भी कोड मौजूद नहीं हो सकता है।
try-with-resources के साथ (The try-with-resources)
आम तौर पर, जब हम किसी भी संसाधन जैसे स्ट्रीम, कनेक्शन आदि का उपयोग करते हैं, तो हमें अंत में Block का उपयोग करके उन्हें स्पष्ट रूप से बंद करना पड़ता है। निम्नलिखित प्रोग्राम में, हम FileReader का उपयोग करके फ़ाइल से डेटा पढ़ रहे हैं और हम इसे अंत में Block का उपयोग करके बंद कर रहे हैं।
Example
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class ReadData_Demo {
public static void main(String args[]) {
FileReader fr = null;
try {
File file = new File(“file.txt”);
fr = new FileReader(file); char [] a = new char[50];
fr.read(a); // reads the content to the array
for(char c : a)
System.out.print(c); // prints the characters one by one
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
try-with-resources, जिसे स्वचालित संसाधन प्रबंधन भी कहा जाता है, एक नया Exception हैंडलिंग तंत्र है जिसे जावा 7 में पेश किया गया था, जो कोशिश पकड़ने वाले Block के भीतर उपयोग किए गए resources को स्वचालित रूप से बंद कर देता है।
इस कथन का उपयोग करने के लिए, आपको केवल आवश्यक resources को brackets के भीतर घोषित करने की आवश्यकता है, और निर्मित संसाधन Block के अंत में स्वचालित रूप से बंद हो जाएगा। निम्नलिखित प्रयास-के-संसाधन कथन का सिंटैक्स है।
Syntax
try(FileReader fr = new FileReader(“file path”)) {
// use the resource
} catch () {
// body of catch
}
}
निम्न प्रोग्राम है जो एक फ़ाइल में डेटा को try-with-resources स्टेटमेंट का उपयोग करके पढ़ता है।
Example
import java.io.FileReader;
import java.io.IOException;
public class Try_withDemo {
public static void main(String args[]) {
try(FileReader fr = new FileReader(“E://file.txt”)) {
char [] a = new char[50];
fr.read(a); // reads the contentto the array
for(char c : a)
System.out.print(c); // prints the characters one by one
} catch (IOException e) {
e.printStackTrace();
}
}
}
ट्राइ-विथ-रिसोर्स स्टेटमेंट के साथ काम करते समय निम्नलिखित बिंदुओं को ध्यान में रखा जाना चाहिए।
- try-with-resources के साथ एक वर्ग का उपयोग करने के लिए इसे AutoCloseable इंटरफ़ेस को लागू करना चाहिए और इसके करीब () विधि को रनटाइम पर स्वचालित रूप से लागू किया जाता है।
- आप try-with-resources के विवरण में एक से अधिक वर्गों की घोषणा कर सकते हैं।
- जब आप try-with-resources के विवरण के प्रयास Block में कई वर्गों की घोषणा करते हैं, तो ये वर्ग उल्टे क्रम में बंद हो जाते हैं।
- brackets के भीतर resources की घोषणा को छोड़कर सब कुछ एक कोशिश Block के सामान्य प्रयास/पकड़ने वाले Block के समान है।
- कोशिश में घोषित संसाधन कोशिश-Block की शुरुआत से ठीक पहले तत्काल हो जाता है।
- कोशिश Block में घोषित संसाधन को स्पष्ट रूप से अंतिम घोषित किया गया है।
यूजर डिफाइंड एक्सेप्शन्स (User-defined Exceptions in Hindi)
आप जावा में अपना Exception बना सकते हैं। अपनी स्वयं की Exception कक्षाएं लिखते समय निम्नलिखित बातों को ध्यान में रखें –
- सभी Exception को थ्रोएबल का Child होना चाहिए।
- यदि आप एक चेक किए गए Exception को लिखना चाहते हैं जो स्वचालित रूप से हैंडल या डिक्लेयर नियम द्वारा लागू किया जाता है, तो आपको Exception वर्ग का विस्तार करने की आवश्यकता है।
- यदि आप रनटाइम Exception लिखना चाहते हैं, तो आपको रनटाइम Exception वर्ग का विस्तार करने की आवश्यकता है।
हम अपने स्वयं के Exception वर्ग को नीचे परिभाषित कर सकते हैं –
class MyException extends Exception {
}
आपको केवल अपना Exception बनाने के लिए पूर्वनिर्धारित Exception वर्ग का विस्तार करने की आवश्यकता है। इन्हें चेक किए गए Exception माना जाता है। निम्नलिखित अपर्याप्तफंड Exception वर्ग एक उपयोगकर्ता-परिभाषित Exception है जो Exception वर्ग को बढ़ाता है, इसे एक चेक Exception बनाता है। एक Exception वर्ग किसी भी अन्य वर्ग की तरह होता है, जिसमें उपयोगी क्षेत्र और विधियाँ होती हैं।
Example
// File Name InsufficientFundsException.java
import java.io.*;
public class InsufficientFundsException extends Exception {
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
हमारे यूज़र-डिफ़ाइंड Exception का उपयोग करके प्रदर्शित करने के लिए, निम्न CheckingAccount वर्ग में एक withdraw() विधि शामिल है जो एक InsufficientFundsException को throws है।
// File Name CheckingAccount.java
import java.io.*;
public class CheckingAccount {
private double balance;
private int number;
public CheckingAccount(int number) {
this.number = number;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException {
if(amount <= balance) {
balance -= amount;
}else {
double needs = amount – balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance() {
return balance;
}
public int getNumber() {
return number;
}
}
निम्नलिखित BankDemo कार्यक्रम चेकिंग खाते के Deposit () और withdrawal () विधियों को लागू करने का प्रदर्शन करता है।
// File Name BankDemo.java
public class BankDemo {
public static void main(String [] args) {
CheckingAccount c = new CheckingAccount(101);
System.out.println(“Depositing $500…”);
c.deposit(500.00);
try {
System.out.println(“\nWithdrawing $100…”);
c.withdraw(100.00);
System.out.println(“\nWithdrawing $600…”);
c.withdraw(600.00);
} catch (InsufficientFundsException e) {
System.out.println(“Sorry, but you are short $” + e.getAmount());
e.printStackTrace();
}
}
}
उपरोक्त तीनों फाइलों को संकलित करें और BankDemo चलाएं। यह निम्नलिखित परिणाम देगा –
Output
Depositing $500…
Withdrawing $100…
Withdrawing $600…
Sorry, but you are short $200.0
InsufficientFundsException
at CheckingAccount.withdraw(CheckingAccount.java:25)
at BankDemo.main(BankDemo.java:13)
सामान्य Exception (Common Exceptions in Hindi)
Java में Exceptions और Errors की दो श्रेणियों को परिभाषित करना संभव है।
जेवीएम Exception − ये Exception/Error हैं जो विशेष रूप से या तार्किक रूप से जेवीएम द्वारा फेंके जाते हैं। उदाहरण: NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException।
प्रोग्रामेटिक एक्सेप्शन – ये एक्सेप्शन एप्लिकेशन या एपीआई प्रोग्रामर द्वारा स्पष्ट रूप से फेंके जाते हैं। उदाहरण: IllegalArgumentException, IllegalStateException।
हम उम्मीद करते है कि आपको “जावा एक्सेप्शन्स (Java Exceptions in Hindi)” से सम्बंधित जानकारी हिंदी में समझ में आयी होंगी यदि आपको बताई गई जानकारी अच्छी लगी हो तो अपने दोस्तों में ऐसे शेयर करे जिससे उनकी भी हेल्प हो सके धन्यवाद!