जावा अपवादों को सही तरीके से कैसे संभालें

जावा अपवादों को सही तरीके से कैसे संभालें

एक प्रोग्रामिंग नौसिखिया के रूप में, की अवधारणा एक्सेप्शन हेंडलिंग अपने सिर को चारों ओर लपेटना कठिन हो सकता है। ऐसा नहीं है कि अवधारणा ही कठिन है, लेकिन शब्दावली इसे उससे कहीं अधिक उन्नत बना सकती है। और यह इतनी शक्तिशाली विशेषता है कि इसका दुरुपयोग और दुरुपयोग होने की संभावना है।





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





जावा अपवादों को समझना

जावा में, एक अपवाद एक ऑब्जेक्ट है जो इंगित करता है कि आपके एप्लिकेशन के चलने के दौरान कुछ असामान्य (या 'असाधारण') हुआ है। ऐसे अपवाद हैं फेंक दिया , जिसका मूल रूप से मतलब है कि एक अपवाद वस्तु बनाई गई है (इसी तरह त्रुटियों को 'उठाया' जाता है)।





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

NullPointerException

s से पहले एक अशक्त चर के पास दुर्घटना का कारण बनने का मौका होता है।



याद रखें, अपवाद केवल एक वस्तु है, लेकिन एक महत्वपूर्ण विशेषता के साथ: इसे से बढ़ाया जाना चाहिए

Exception

वर्ग या का कोई उपवर्ग





Exception

. जबकि जावा में सभी प्रकार के अंतर्निहित अपवाद हैं, आप चाहें तो अपना स्वयं का भी बना सकते हैं। कुछ के सबसे आम जावा अपवाद शामिल:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

तो क्या होता है जब आप अपवाद फेंकते हैं?





सबसे पहले, जावा यह देखने के लिए तत्काल विधि में दिखता है कि क्या कोई कोड है जो आपके द्वारा फेंके गए अपवाद को संभालता है। यदि कोई हैंडलर मौजूद नहीं है, तो यह उस विधि को देखता है जिसे वर्तमान विधि कहा जाता है यह देखने के लिए कि कोई हैंडल वहां मौजूद है या नहीं। यदि नहीं, तो यह उस विधि को देखता है जिसे कहा जाता है वह विधि, और फिर अगली विधि, आदि। यदि अपवाद नहीं पकड़ा जाता है, तो एप्लिकेशन एक स्टैक ट्रेस प्रिंट करता है और फिर क्रैश हो जाता है। (वास्तव में यह केवल दुर्घटनाग्रस्त होने की तुलना में अधिक बारीक है, लेकिन यह इस लेख के दायरे से परे एक उन्नत विषय है।)

प्रति स्टैक ट्रेस उन सभी विधियों की एक सूची है जो जावा एक अपवाद हैंडलर की तलाश करते समय पार करता है। यहाँ एक स्टैक ट्रेस कैसा दिखता है:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

इससे हम बहुत कुछ हासिल कर सकते हैं। सबसे पहले, फेंका गया अपवाद a . था

NullPointerException

. यह में हुआ

getTitle()

Book.java की लाइन 16 पर विधि। उस विधि को से बुलाया गया था

getBookTitles()

Author.java की लाइन 25 पर। उस विधि से बुलाया गया था

main()

बूटस्ट्रैप.जावा की लाइन 14 पर। जैसा कि आप देख सकते हैं, यह सब जानने से डिबगिंग आसान हो जाती है।

लेकिन फिर से, अपवादों का वास्तविक लाभ यह है कि आप अपवाद को पकड़कर, चीजों को ठीक करके, और क्रैश किए बिना एप्लिकेशन को फिर से शुरू करके असामान्य स्थिति को 'हैंडल' कर सकते हैं।

कोड में जावा अपवादों का उपयोग करना

मान लीजिए आपके पास है

someMethod()

यह एक पूर्णांक लेता है और कुछ तर्क निष्पादित करता है जो पूर्णांक 0 से कम या 100 से अधिक होने पर टूट सकता है। यह अपवाद फेंकने के लिए एक अच्छी जगह हो सकती है:

प्राकृतिक आवाजों के साथ मुफ्त टेक्स्ट टू स्पीच सॉफ्टवेयर
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

इस अपवाद को पकड़ने के लिए, आपको कहाँ जाना होगा

someMethod()

कहा जाता है और इसका उपयोग करते हैं ट्राई-कैच ब्लॉक :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

के भीतर सब कुछ प्रयत्न जब तक कोई अपवाद नहीं फेंका जाता तब तक ब्लॉक क्रम में निष्पादित होगा। जैसे ही एक अपवाद फेंका जाता है, बाद के सभी बयानों को छोड़ दिया जाता है और एप्लिकेशन तर्क तुरंत कूद जाता है पकड़ खंड मैथा।

हमारे उदाहरण में, हम कोशिश ब्लॉक दर्ज करते हैं और तुरंत कॉल करते हैं

someMethod()

. चूँकि २००, ० और १०० के बीच नहीं है, an

IllegalArgumentException

फेंक दिया जाता है। यह तुरंत निष्पादन समाप्त करता है

someMethod()

, कोशिश ब्लॉक में शेष तर्क को छोड़ देता है (

someOtherMethod()

कभी नहीं कहा जाता है), और कैच ब्लॉक के भीतर निष्पादन को फिर से शुरू करता है।

क्या होगा अगर हम कॉल करें

someMethod(50)

बजाय? NS

IllegalArgumentException

कभी नहीं फेंका जाएगा।

someMethod()

सामान्य रूप से निष्पादित होगा। कोशिश ब्लॉक सामान्य रूप से निष्पादित होगा, कॉलिंग

someOtherMethod()

जब someMethod() पूरा हो जाता है। कब

someOtherMethod()

समाप्त होता है, कैच ब्लॉक को छोड़ दिया जाएगा और

callingMethod()

जारी रहेगा।

ध्यान दें कि आपके पास प्रति प्रयास ब्लॉक में कई कैच ब्लॉक हो सकते हैं:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

यह भी ध्यान दें कि एक वैकल्पिक आखिरकार ब्लॉक भी मौजूद है:

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

अंत में ब्लॉक के भीतर कोड है हमेशा निष्पादित किया गया कोई फर्क नहीं पड़ता। यदि आपके पास ट्राई ब्लॉक में रिटर्न स्टेटमेंट है, तो विधि से वापस लौटने से पहले अंत में ब्लॉक को निष्पादित किया जाता है। यदि आप कैच ब्लॉक में एक और अपवाद फेंकते हैं, तो अपवाद को फेंकने से पहले अंत में ब्लॉक निष्पादित किया जाता है।

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

ध्यान दें कि आपके पास कैच ब्लॉक के बिना अंत में ब्लॉक हो सकता है:

public void method() {
try {
// ...
} finally {
// ...
}
}

यह आपको फेंके गए अपवादों को विधि आमंत्रण स्टैक को प्रचारित करने की अनुमति देते हुए कोई भी आवश्यक सफाई करने देता है (यानी आप यहां अपवाद को संभालना नहीं चाहते हैं लेकिन आपको अभी भी पहले साफ करने की आवश्यकता है)।

जावा में चेक किए गए बनाम अनियंत्रित अपवाद

अधिकांश भाषाओं के विपरीत, जावा के बीच अंतर करता है जाँचे गए अपवाद तथा अनियंत्रित अपवाद (उदाहरण के लिए सी # में केवल अनियंत्रित अपवाद हैं)। एक जाँच अपवाद अवश्य उस विधि में पकड़ा जाए जहां अपवाद फेंका गया है अन्यथा कोड संकलित नहीं होगा।

एक चेक अपवाद बनाने के लिए, से विस्तार करें

Exception

. एक अनियंत्रित अपवाद बनाने के लिए, से विस्तार करें

RuntimeException

.

कोई भी विधि जो चेक किए गए अपवाद को फेंकती है, उसे विधि हस्ताक्षर में इसका उपयोग करके निरूपित करना चाहिए फेंकता खोजशब्द। चूंकि जावा का बिल्ट-इन

IOException

एक चेक अपवाद है, निम्न कोड संकलित नहीं होगा:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

आपको पहले घोषित करना होगा कि यह एक चेक अपवाद फेंकता है:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

ध्यान दें कि एक विधि को अपवाद फेंकने के रूप में घोषित किया जा सकता है लेकिन वास्तव में कभी अपवाद नहीं फेंकता है। फिर भी, अपवाद को अभी भी पकड़ने की आवश्यकता होगी अन्यथा कोड संकलित नहीं होगा।

आपको चेक या अनचेक अपवादों का उपयोग कब करना चाहिए?

आधिकारिक जावा प्रलेखन में एक है इस प्रश्न पर पेज . यह अंगूठे के एक संक्षिप्त नियम के साथ अंतर का सार प्रस्तुत करता है: 'यदि किसी ग्राहक से किसी अपवाद से उबरने की अपेक्षा की जा सकती है, तो इसे एक जाँच अपवाद बना दें। यदि कोई क्लाइंट अपवाद से उबरने के लिए कुछ नहीं कर सकता है, तो इसे एक अनियंत्रित अपवाद बनाएं।'

लेकिन यह गाइडलाइन पुरानी हो सकती है। एक ओर, चेक किए गए अपवादों का परिणाम अधिक मजबूत कोड में होता है। दूसरी ओर, किसी अन्य भाषा ने जावा के समान अपवादों की जाँच नहीं की है, जो दो चीजें दिखाता है: एक, यह सुविधा अन्य भाषाओं के लिए इसे चुराने के लिए पर्याप्त उपयोगी नहीं है, और दो, आप उनके बिना बिल्कुल रह सकते हैं। इसके अलावा, चेक किए गए अपवाद जावा 8 में पेश किए गए लैम्ब्डा एक्सप्रेशन के साथ अच्छी तरह से नहीं खेलते हैं।

जावा अपवाद उपयोग के लिए दिशानिर्देश

अपवाद उपयोगी हैं लेकिन आसानी से दुरुपयोग और दुरुपयोग किया जाता है। यहां कुछ युक्तियां और सर्वोत्तम अभ्यास दिए गए हैं, जिनकी मदद से आप उनमें गड़बड़ी करने से बच सकते हैं।

  • सामान्य अपवादों के लिए विशिष्ट अपवादों को प्राथमिकता दें। उपयोग |_+_| ओवर |_+_| जब संभव हो, अन्यथा उपयोग करें |_+_| ओवर |_+_| जब संभव।
  • कभी न पकड़ें |_+_| ! |_+_| कक्षा वास्तव में फैली हुई है |_+_| , और कैच ब्लॉक वास्तव में |_+_| . के साथ काम करता है या कोई भी वर्ग जो थ्रोबल का विस्तार करता है। हालांकि, |_+_| वर्ग भी विस्तारित होता है |_+_| , और आप कभी भी एक |_+_| . पकड़ना नहीं चाहते हैं क्योंकि |_+_| s गंभीर अप्राप्य मुद्दों का संकेत देते हैं।
  • कभी न पकड़ें |_+_| ! |_+_| विस्तारित |_+_| , इसलिए कोई भी ब्लॉक जो पकड़ता है |_+_| भी पकड़ेगा |_+_| , और यह एक बहुत ही महत्वपूर्ण अपवाद है जिसके साथ आप खिलवाड़ नहीं करना चाहते (विशेषकर बहु-थ्रेडेड अनुप्रयोगों में) जब तक कि आप यह नहीं जानते कि आप क्या कर रहे हैं। यदि आप नहीं जानते कि इसके बजाय किस अपवाद को पकड़ना है, तो कुछ भी न पकड़ने पर विचार करें।
  • डिबगिंग को आसान बनाने के लिए वर्णनात्मक संदेशों का उपयोग करें। जब आप कोई अपवाद फेंकते हैं, तो आप एक |_+_| . प्रदान कर सकते हैं तर्क के रूप में संदेश। इस संदेश को |_+_| . का उपयोग करके कैच ब्लॉक में पहुँचा जा सकता है विधि, लेकिन अगर अपवाद कभी पकड़ा नहीं जाता है, तो संदेश स्टैक ट्रेस के हिस्से के रूप में भी दिखाई देगा।
  • अपवादों को पकड़ने और अनदेखा न करने का प्रयास करें। चेक किए गए अपवादों की असुविधा को दूर करने के लिए, बहुत से नौसिखिया और आलसी प्रोग्रामर कैच ब्लॉक स्थापित करेंगे लेकिन इसे खाली छोड़ देंगे। खराब! हमेशा इसे इनायत से संभालें, लेकिन यदि आप नहीं कर सकते हैं, तो कम से कम एक स्टैक ट्रेस का प्रिंट आउट लें ताकि आप जान सकें कि अपवाद फेंक दिया गया था। आप इसका उपयोग कर सकते हैं |_+_| तरीका।
  • अति प्रयोग अपवादों से सावधान रहें। जब आपके पास हथौड़ा होता है, तो सब कुछ कील जैसा दिखता है। जब आप पहली बार अपवादों के बारे में सीखते हैं, तो आप सब कुछ एक अपवाद में बदलने के लिए बाध्य महसूस कर सकते हैं ... याद रखें, अपवाद 'असाधारण' घटनाओं के लिए होते हैं!

अब आपको अपवादों के साथ इतना सहज होना चाहिए कि आप समझ सकें कि वे क्या हैं, उनका उपयोग क्यों किया जाता है, और उन्हें अपने कोड में कैसे शामिल किया जाए। यदि आप अवधारणा को पूरी तरह से नहीं समझते हैं, तो कोई बात नहीं! इसे मेरे दिमाग में 'क्लिक' करने में मुझे कुछ समय लगा, इसलिए ऐसा महसूस न करें कि आपको इसे जल्दी करने की आवश्यकता है। पर्याप्त समय लो।

कोई सवाल है? किसी अन्य अपवाद-संबंधी युक्तियों के बारे में जानें जो मुझे याद नहीं हैं? उन्हें नीचे टिप्पणी में साझा करें!

साझा करना साझा करना कलरव ईमेल किसी भी प्रोजेक्ट के डेटा को विज़ुअलाइज़ करने के लिए डेटा-फ़्लो आरेख कैसे बनाएं

किसी भी प्रक्रिया के डेटा-फ्लो डायग्राम (DFD) आपको यह समझने में मदद करते हैं कि स्रोत से गंतव्य तक डेटा कैसे प्रवाहित होता है। इसे बनाने का तरीका यहां बताया गया है!

आगे पढ़िए
संबंधित विषय
  • प्रोग्रामिंग
  • जावा
लेखक के बारे में जोएल ली(१५२४ लेख प्रकाशित)

जोएल ली 2018 से MakeUseOf के प्रधान संपादक हैं। उनके पास बी.एस. कंप्यूटर साइंस में और नौ साल से अधिक के पेशेवर लेखन और संपादन का अनुभव।

ऑडियो विवरण बंद करें अमेज़न प्राइम
जोएल ली . की अन्य फ़िल्में-टीवी शो

हमारे न्यूज़लेटर की सदस्यता लें

तकनीकी युक्तियों, समीक्षाओं, निःशुल्क ई-पुस्तकों और अनन्य सौदों के लिए हमारे न्यूज़लेटर से जुड़ें!

सब्सक्राइब करने के लिए यहां क्लिक करें