Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java एक्सेप्शन हैंडलिंग में मास्टरी: एक व्यापक गाइड

एक Java डेवलपर के रूप में, आपके पास Java एक्सेप्शन और एक्सेप्शन हैंडलिंग का अच्छा ज्ञान होना चाहिए।

यह ट्यूटोरियल वह बुनियादी ज्ञान प्रदान करता है जो हर प्रोग्रामर के पास Java प्रोग्राम के साथ काम करते समय होना चाहिए। शुरू करने के लिए, आइए समझना शुरू करें कि वास्तव में Java एक्सेप्शन क्या हैं।

Java एक्सेप्शन क्या हैं

एक Java प्रोग्राम उन समस्याओं में पड़ सकता है जो इसके निष्पादन के दौरान अचानक समाप्त होने का परिणाम देती हैं। इन समस्याओं को एक्सेप्शन कहा जाता है।

एक अच्छे प्रोग्रामर को निष्पादन के दौरान होने वाली त्रुटियों को पहचानने में सक्षम होना चाहिए और ऐसे एक्सेप्शन के मामले में प्रोग्राम के लिए वैकल्पिक मार्ग प्रदान करना चाहिए। इस अभ्यास को एक्सेप्शन हैंडलिंग कहा जाता है।

अब आप सोच रहे होंगे कि हमें एक्सेप्शन हैंडलिंग की आवश्यकता क्यों है। ऐसे प्रोग्राम क्यों न लिखें जो एक्सेप्शन न फेंकें?

हमें एक्सेप्शन हैंडलिंग की आवश्यकता क्यों है

जैसा कि यह पता चलता है, ऐसे प्रोग्राम लिखना जो एक्सेप्शन न फेंकें उतना आसान नहीं है जितना लगता है। ज्यादातर समय, ये अपरिहार्य त्रुटियां प्रोग्रामर के नियंत्रण से बाहर होती हैं।

यूजर इनपुट स्वीकार करने वाले प्रोग्राम यूजर द्वारा प्रदान किए गए अमान्य इनपुट के कारण एक्सेप्शन में पड़ने की संभावना रखते हैं। इसी तरह बाहरी फाइलें पढ़ना इस संभावना को ध्यान में रखते हुए कि उन्हें प्रोग्रामर के ज्ञान के बिना किसी बाहरी स्रोत द्वारा स्थानांतरित, नाम बदला या हटाया गया हो।

ऐसे मामलों में, प्रोग्राम को निष्पादन को समाप्त किए बिना एक्सेप्शन को ग्रेसफुली हैंडल करने में सक्षम होना चाहिए।

Java एक्सेप्शन की पदानुक्रम

Java में सभी एक्सेप्शन Exception क्लास के चाइल्ड होने चाहिए, जो स्वयं Throwable क्लास का चाइल्ड है।

Exception क्लास के दो मुख्य सबक्लास RuntimeException और IOException हैं।

एक्सेप्शन बनाम एरर

Throwable क्लास का एक और चाइल्ड क्लास Error क्लास है। हालांकि, एरर्स एक्सेप्शन से अलग हैं।

एरर्स उन समस्याओं को इंगित करते हैं जो JVM निष्पादन के दौरान सामना कर सकता है। ये समस्याएं आमतौर पर गंभीर और अपरिवर्तनीय होती हैं। मेमोरी लीक और लाइब्रेरी असंगति समस्याएं प्रोग्राम में एरर्स के सामान्य कारण हैं।

StackOverflowError और OutOfMemoryError Java एरर्स के दो उदाहरण हैं।

चेक्ड और अनचेक्ड एक्सेप्शन

हम Java एक्सेप्शन को दो मुख्य श्रेणियों में विभाजित कर सकते हैं: चेक्ड और अनचेक्ड एक्सेप्शन।

चेक्ड एक्सेप्शन वे एक्सेप्शन हैं जिन्हें कंपाइल करने से पहले प्रोग्राम में हैंडल करने की आवश्यकता होती है। यदि इन एक्सेप्शन को हैंडल नहीं किया जाता है, तो प्रोग्राम Java कंपाइलर द्वारा कंपाइल नहीं किया जाएगा। इसलिए, इन्हें कंपाइल-टाइम एक्सेप्शन भी कहा जाता है। IOExceptions चेक्ड एक्सेप्शन के अच्छे उदाहरण हैं।

अनचेक्ड एक्सेप्शन वे एक्सेप्शन हैं जिन्हें कंपाइलर प्रोग्राम को कंपाइल करते समय अनदेखा करता है। चाहे हमने इन एक्सेप्शन को प्रोग्राम में हैंडल किया हो या नहीं, इससे कोई फर्क नहीं पड़ता जब प्रोग्राम कंपाइल होता है। चूंकि इन एक्सेप्शन पर एक्सेप्शन हैंडलिंग लागू नहीं की जाती है, हमारा प्रोग्राम RuntimeExceptions में पड़ सकता है जिसके परिणामस्वरूप प्रोग्राम समाप्त हो जाता है।

RuntimeException क्लास को एक्सटेंड करने वाली सभी क्लासेस अनचेक्ड एक्सेप्शन हैं। ऐसी दो क्लासेस के उदाहरण NullPointerException और ArrayIndexOutOfBoundsException हैं।

Exception क्लास में आमतौर पर उपयोग किए जाने वाले मेथड्स

हम Java Exception क्लास में कुछ आमतौर पर उपयोग किए जाने वाले मेथड्स से गुजरेंगे:

  1. getMessage: हुए एक्सेप्शन के बारे में विवरण वाला मैसेज लौटाता है।
  2. printStackTrace: हुए एक्सेप्शन का स्टैक ट्रेस लौटाता है।
  3. toString: क्लास का नाम और getMessage मेथड के साथ लौटाया गया मैसेज लौटाता है।

एक्सेप्शन कैसे हैंडल करें

आइए देखें कि हम Java में एक्सेप्शन कैसे हैंडल कर सकते हैं:

try-catch

हम Java में try-catch ब्लॉक का उपयोग करके एक्सेप्शन को पकड़ और ठीक से हैंडल कर सकते हैं।

इस सिंटैक्स में, कोड का वह हिस्सा जो एक्सेप्शन फेंकने की संभावना रखता है, एक try ब्लॉक के अंदर रखा जाता है और catch ब्लॉक/ब्लॉक्स फेंके गए एक्सेप्शन/एक्सेप्शन को पकड़ते हैं और हमारे द्वारा प्रदान किए गए लॉजिक के अनुसार उन्हें हैंडल करते हैं।

try-catch ब्लॉक का बुनियादी सिंटैक्स इस प्रकार है:

try { //exception-prone code } catch(Exception e) { //error handling logic } 

इस दृष्टिकोण के साथ, जब प्रोग्राम द्वारा एक्सेप्शन फेंका जाता है तो प्रोग्राम निष्पादन को रोकता नहीं है, बल्कि इसे ग्रेसफुली हैंडल किया जाता है।

हम देखेंगे कि Java प्रोग्राम में FileReader क्लास द्वारा फेंके गए IOExceptions को कैसे हैंडल किया जाए।

उदाहरण:

import java.io.FileReader; public class TryCatchBlockExample { public static void main(String[] args) { try { FileReader file = new FileReader("source.txt"); file.read(); } catch(Exception e) { e.printStackTrace(); } } } 

यहां, हमने FileReader क्लास को इंस्टेंटिएट करते समय फेंके गए FileNotFoundException और FileReader क्लास के read() मेथड द्वारा फेंके गए IOException को हैंडल करने के लिए एक सिंगल catch ब्लॉक का उपयोग किया है।

ये दोनों एक्सेप्शन Exception क्लास के चाइल्ड हैं।

हम सिंगल try स्टेटमेंट के अंदर कोड द्वारा फेंके गए विभिन्न प्रकार के एरर्स को पकड़ने के लिए कई catch स्टेटमेंट्स का भी उपयोग कर सकते हैं। पिछले उदाहरण के लिए, हम FileNotFoundException को पकड़ने के लिए एक catch ब्लॉक और IOException के लिए दूसरा catch ब्लॉक उपयोग कर सकते हैं जैसा कि निम्न कोड स्निपेट दिखाता है:

import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TryCatchBlockExample { public static void main(String[] args) { try { FileReader file = new FileReader("source.txt"); file.read(); file.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } } 

यदि फेंका गया एक्सेप्शन पहले catch स्टेटमेंट द्वारा हैंडल किए गए एक्सेप्शन से मेल खाता है, तो इसे पहले catch स्टेटमेंट के अंदर लॉजिक द्वारा हैंडल किया जाता है।

यदि एक्सेप्शन मेल नहीं खाते हैं, तो इसे दूसरे catch स्टेटमेंट पर पास किया जाता है। यदि दो से अधिक catch स्टेटमेंट हैं, तो यह प्रक्रिया तब तक जारी रहती है जब तक एक्सेप्शन उस catch स्टेटमेंट तक नहीं पहुंच जाता जो उसके प्रकार को पकड़ता है।

चूंकि FileNotFoundException IOException का सबटाइप है, दूसरे catch स्टेटमेंट का उपयोग FileNotFoundException को पकड़ने के लिए करना काम नहीं करेगा। इसे पहले catch स्टेटमेंट द्वारा हैंडल किया जाएगा और कभी दूसरे स्टेटमेंट तक नहीं पहुंचेगा।

नोट: try स्टेटमेंट के साथ कम से कम एक catch स्टेटमेंट का उपयोग करना अनिवार्य है।

finally

जब हम अपने प्रोग्राम में एक्सेप्शन पकड़ने के लिए try-catch ब्लॉक का उपयोग करते हैं, तो ऐसे उदाहरण होते हैं जहां हम तर्क लागू करना चाहते हैं चाहे एक्सेप्शन पकड़ा गया हो या नहीं। ऐसे मामलों में, हम केवल try-catch ब्लॉक के बजाय try-catch-finally ब्लॉक का उपयोग कर सकते हैं।

फिर, finally स्टेटमेंट के अंदर का कोड लागू किया जाता है चाहे एक्सेप्शन हो या नहीं। finally स्टेटमेंट हमेशा try-catch-finally ब्लॉक के अंत में आना चाहिए।

उदाहरण के लिए, जब हम फाइल पढ़ने के लिए FileReader क्लास का उपयोग करते हैं, तो प्रोसेसिंग के अंत में खुली फाइल को बंद करना आवश्यक होता है चाहे एक्सेप्शन हो या नहीं। इसे सुनिश्चित करने के लिए, हम फाइल को बंद करने का कोड finally स्टेटमेंट के अंदर रख सकते हैं।

import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TryCatchFinallyBlockExample { public static void main(String[] args) { FileReader file = null; try { file = new FileReader("source.txt"); file.read(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } finally { file.close(); } } } 

हालांकि, यदि आप उपरोक्त कोड को कंपाइल करने का प्रयास करते हैं, तो कोड अनहैंडल IOException के कारण कंपाइल नहीं होगा। ऐसा इसलिए है क्योंकि FileReader क्लास का close() मेथड भी IOExceptions फेंक सकता है। इसलिए, हमें इस हिस्से को दूसरे try ब्लॉक के अंदर रखना होगा जैसे:

import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TryCatchFinallyBlockExample { public static void main(String[] args) { FileReader file = null; try { file = new FileReader("source.txt"); file.read(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } finally { try { file.close(); } catch(IOException e) { e.printStackTrace(); } } } } 

throws

Java में throws कीवर्ड का उपयोग करके एरर्स हैंडल करना सरल है। वास्तव में, इस दृष्टिकोण में, आप वास्तव में उस स्थान पर एक्सेप्शन को हैंडल नहीं करते जहां यह होता है। इसके बजाय, हम वर्तमान मेथड से एक्सेप्शन को उस मेथड पर फेंक देते हैं जिसने वर्तमान मेथड को बुलाया था। फिर, एरर को हैंडल करना बाहरी मेथड की जिम्मेदारी बन जाता है।

एक मेथड से एक्सेप्शन फेंकने के लिए, आपको बस यह घोषित करना होगा कि यह मेथड विचाराधीन एक्सेप्शन फेंक सकता है। आइए देखें कि हम FileReader क्लास द्वारा फेंके गए IOExceptions को इस दृष्टिकोण का उपयोग करके कैसे हैंडल कर सकते हैं।

उदाहरण:

import java.io.FileReader; import java.io.IOException; public class ThrowsExample { public void readFile throws IOException { FileReader file = new FileReader("source.txt"); file.read(); file.close(); } } 

throw

इस सूची के अन्य दृष्टिकोणों के विपरीत, throw कीवर्ड का उपयोग एरर्स हैंडल करने के लिए नहीं किया जाता है। लेकिन चूंकि अधिकांश लोग throw कीवर्ड को throws कीवर्ड के साथ भ्रमित करते हैं, हमने सोचा कि यहां चर्चा करना सबसे अच्छा होगा।

throw कीवर्ड का उपयोग एक्सेप्शन को स्पष्ट रूप से इनवोक करने के लिए किया जाता है। हम एक नया इंस्टेंटिएटेड एक्सेप्शन या मेथड के अंदर पकड़े गए एक्सेप्शन को फेंक सकते हैं।

public class ThrowExample { public void invalidate(int amount) throws Exception { if (amount < 500) { throw new Exception("Amount not sufficient"); } } } 

यूजर-डिफाइंड एक्सेप्शन

बिल्ट-इन Java एक्सेप्शन का उपयोग करने के अलावा, आप अपने स्वयं के एक्सेप्शन परिभाषित कर सकते हैं। आप उन्हें या तो चेक्ड या अनचेक्ड एक्सेप्शन के रूप में परिभाषित कर सकते हैं। एक नया चेक्ड एक्सेप्शन बनाने के लिए, आपके नए एक्सेप्शन को Exception क्लास को एक्सटेंड करना चाहिए।

एक अनचेक्ड एक्सेप्शन बनाने के लिए, RuntimeException क्लास को एक्सटेंड करें।

निम्नलिखित कोड उदाहरण में, हमने एक यूजर-डिफाइंड चेक्ड एक्सेप्शन बनाया है:

public class InvalidLengthException extends Exception { private int length; private String message; public InvalidLengthException(int length, String message) { this.length=length; this.message=message; } public int getAmount() { return this.length; } public String getMessage() { return this.message; } } 

अब हम उपरोक्त एक्सेप्शन को अपने प्रोग्राम लॉजिक में ऐसे उपयोग कर सकते हैं:

public class InputChecker { private int minLength; private int maxLength; public InputChecker(int minLength, int maxLength) { this.minLength=minLength; this.maxLength=maxLength; } public void checkStringLength(String strInput) throws InvalidLengthException { int strLength = strInput.length(); if (strLength < minLength) { throw new InvalidLengthException(strLength, "Input should have minimum "+minLength+" characters"); } else if (strLength > maxLength){ throw new InvalidLengthException(strLength, "Input should have maximum "+maxLength+" character"); } } } 

यदि हम InputChecker क्लास का उपयोग करके स्ट्रिंग की लंबाई की जांच करते हैं, तो यह InvalidLengthException फेंकेगा यदि स्ट्रिंग की लंबाई न्यूनतम लंबाई से कम या अधिकतम लंबाई से अधिक है।

public class Main { public static void main(String[] args) { InputChecker ic = new InputChecker(2, 7); try { ic.checkStringLength("longer than the maximum length"); } catch(InvalidLengthException e) { e.printStackTrace(); } } } 

जब हम उपरोक्त कोड स्निपेट चलाते हैं, तो यह InvalidLengthException फेंकेगा और हमें निम्नलिखित आउटपुट मिलेगा:

InvalidLengthException: Input should have maximum 7 character at InputChecker.checkStringLength(InputChecker.java:17) at Main.main(Main.java:6) 

निष्कर्ष

इस ट्यूटोरियल में, हमने आपको Java एक्सेप्शन का एक त्वरित और संक्षिप्त परिचय दिया। हमें उम्मीद है कि अब आपको इस बात की अच्छी समझ है कि एक्सेप्शन क्या हैं और अपने Java प्रोग्राम में उन्हें कैसे हैंडल करें।


  1. - Java में Exception Throw करना

    Java Exceptions Exceptions प्रोग्राम निष्पादन के दौरान होने वाली अप्रत्याशित घटनाएं हैं। जब आपका कोड किसी exception का सामना करता है, तो आपके प्रोग्राम का प्रवाह समाप्त हो जाएगा। यह महत्वपूर्ण है कि जब आप Java में कोडिंग कर रहे हों तो आप exceptions को सही ढंग से संभालें। अन्यथा, आपका कोड निष्पादन के

  1. - JSP में अपवाद कैसे संभालें?

    <c:catch> टैग अपने बॉडी में होने वाले किसी भी Throwable को पकड़ता है और वैकल्पिक रूप से इसे उजागर करता है। इसका उपयोग त्रुटि संभाल के लिए और समस्या से अधिक सुंदर तरीके से निपटने के लिए किया जाता है। एट्रिब्यूट्स <c:catch> टैग में निम्नलिखित एट्रिब्यूट्स होते हैं: एट्रिब्यूटविवरणआवश्य

  1. C++ में एक्सेप्शन कैसे काम करते हैं C++ में एक्सेप्शन कैसे काम करते हैं

    परिचयC++ में एक्सेप्शन हैंडलिंग रनटाइम त्रुटियों को संभालने की एक प्रक्रिया है। एक्सेप्शन एक घटना है जो C++ में रनटाइम पर फेंकी जाती है। सभी एक्सेप्शन std::exception क्लास से प्राप्त होते हैं। यह एक रनटाइम त्रुटि है जिसे संभाला जा सकता है। यदि हम एक्सेप्शन को नहीं संभालते हैं तो यह एक्सेप्शन संदेश प