1. अपवाद
>
लंबे समय तक, प्रोग्रामर ने त्रुटि प्रबंधन को मानकीकृत और स्वचालित करने के बारे में सोचा। यह तब हुआ जब अपवादों का आविष्कार किया गया। अब अपवाद तंत्र 80% असाधारण स्थितियों को संभालता है।
अगर कुछ विद्वान अपवादों के साथ आए, तो यह संभवतः उनके डॉक्टरेट शोध प्रबंध का विषय था। यदि कोई प्रोग्रामर इसके साथ आया था, तो उसे एक सहकर्मी से पीठ पर एक दोस्ताना थपथपाया होगा: "ठीक है, भाई लगता है।"
जब जावा प्रोग्राम में कोई त्रुटि होती है, जैसे कि विभाजन द्वारा 0
, कुछ अद्भुत चीजें होती हैं:
पहला कदम
एक विशेष अपवाद वस्तु बनाई जाती है, जिसमें हुई त्रुटि के बारे में जानकारी होती है।
जावा में सब कुछ एक वस्तु है, और अपवाद कोई अपवाद नहीं हैं 🙂 अपवाद वस्तुओं की अपनी कक्षाएं होती हैं, और केवल एक चीज जो उन्हें सामान्य कक्षाओं से अलग करती है, वह यह है कि वे कक्षा को विरासत में मिलाते हैं Throwable
।
दूसरा चरण
अपवाद वस्तु "फेंक दी गई" है। शायद यहाँ शब्दांकन बेहतर हो सकता है। "अपवाद फेंकना" फायर अलार्म ट्रिगर करने या "डेफकॉन 1" अलर्ट बजने जैसा है।
जब जावा मशीन में एक अपवाद फेंका जाता है, तो प्रोग्राम का सामान्य संचालन बंद हो जाता है और "आपातकालीन प्रोटोकॉल" शुरू हो जाते हैं।
तीसरा कदम
जिस तरीके से अपवाद फेंका गया था वह तुरंत बाहर निकल जाता है। कॉलिंग विधि को अपवाद दिया जाता है, जो तुरंत बाहर निकल जाता है। और इसी तरह चेन को नीचे तब तक चलाते रहें जब तक कि main
मेथड बाहर न निकल जाए। जब main
विधि समाप्त हो जाती है, तो कार्यक्रम भी समाप्त हो जाता है।
उदाहरण:
कोड | कंसोल आउटपुट |
---|---|
|
|
लाइन 20 पर एक अपवाद होता है: 0 से विभाजन। जावा मशीन तुरंत एक अपवाद बनाता है - एक ArithmeticException
वस्तु और इसे विधि में "फेंकता" है।
विधि divide()
तुरंत समाप्त हो जाती है, इसलिए हम कभी भी स्ट्रिंग नहीं देखते हैं: कुछ भी भयानक नहीं हुआ: 0. कार्यक्रम endTheWorld()
विधि पर लौटता है, और स्थिति खुद को दोहराती है: सिस्टम में एक अनियंत्रित अपवाद है, जिसका अर्थ है कि विधि endTheWorld()
भी असामान्य रूप से समाप्त हो जाती है। तब main
विधि समाप्त हो जाती है, और कार्यक्रम बंद हो जाता है।
इन अपवादों का उद्देश्य क्या है? ठीक है, आप विशेष प्रकार के अपवादों को पकड़ने के लिए अपना स्वयं का कोड लिख सकते हैं और असाधारण स्थितियों को संभालने के लिए अपना स्वयं का तर्क लिख सकते हैं।
2. अपवादों को पकड़ना:try-catch
जावा में एक अपवाद पकड़ने वाला तंत्र है जो आपको तरीकों की इस असामान्य समाप्ति को रोकने देता है। यह इस तरह दिख रहा है:
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
इस निर्माण को try-catch
ब्लॉक कहा जाता है।
कोड जहां अपवाद हो सकता है, घुंघराले ब्रेसिज़ में लपेटा जाता है, शब्द से पहले try
।
घुंघराले ब्रेसिज़ के बाद, हमारे पास catch
कीवर्ड और, कोष्ठक के अंदर, एक अपवाद चर की घोषणा है । इसके बाद घुंघराले ब्रेसिज़ होते हैं जो निर्दिष्ट प्रकार का अपवाद होने पर कोड को निष्पादित करने के लिए लपेटते हैं ।
यदि " प्राथमिक कोड " के निष्पादन के दौरान कोई अपवाद नहीं फेंका जाता है , तो कैच ब्लॉक के अंदर का कोड निष्पादित नहीं किया जाएगा। यदि कोई अपवाद होता है, तो यह होगा (यदि फेंके गए अपवाद का प्रकार कोष्ठक में चर के प्रकार के समान है)।
उदाहरण:
कोड | कंसोल आउटपुट |
---|---|
|
|
3. एकाधिक catch
ब्लॉक
सिद्धांत रूप में, कोड के एक ब्लॉक में सभी प्रकार के अपवादों को फेंका जा सकता है। कुछ को आप एक तरह से संभालना चाहेंगे, दूसरों को दूसरे तरीके से, और फिर भी अन्य को आप बिल्कुल भी नहीं संभालने का फैसला करेंगे।
जावा डेवलपर्स ने आपकी मदद करने का फैसला किया और आपको ब्लॉक के बाद एक नहीं बल्कि कई catch
ब्लॉक लिखने दिए।try
try
{
// Code where an exception might occur
}
catch (ExceptionType1 name1)
{
// Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
// Code for handling ExceptionType2
}
catch (ExceptionType3 name3)
{
// Code for handling ExceptionType3
}
उदाहरण:
कोड | कंसोल आउटपुट |
---|---|
|
|
4. catch
ब्लॉकों का क्रम
किसी ब्लॉक में होने वाले अपवादों को केवल एक ही ब्लॉक try
द्वारा पकड़ा जा सकता है । आपके पास अपवाद प्रबंधन की स्थिति नहीं हो सकती है जहां एकाधिक ब्लॉक से कोड निष्पादित हो जाता है।catch
catch
लेकिन ब्लॉकों का क्रम मायने रखता है।
आपके पास ऐसी स्थिति हो सकती है जहां एकाधिक ब्लॉकों द्वारा अपवाद पकड़ा जा सकता है। यदि ऐसा है, तो जो भी पकड़ ब्लॉक पहले आता है ( try
ब्लॉक के निकटतम) द्वारा अपवाद पकड़ा जाएगा।
आपके पास ऐसी स्थिति कैसे हो सकती है जहां एकाधिक कैच ब्लॉक एक ही अपवाद को पकड़ सकें?
सभी अपवाद एकल वंशानुक्रम पदानुक्रम से संबंधित हैं - चित्र देखें।
एक ArithmeticException
ऑब्जेक्ट को एक वेरिएबल को असाइन किया जा सकता है जिसका प्रकार है ArithmeticException
या इसका कोई पूर्वज वर्ग: RuntimeException
, Exception
और Throwable
— आरेख देखें।
हम स्तर 21 में वंशानुक्रम और पूर्वज वर्गों के बारे में अधिक बात करेंगे।
यह कोड ठीक संकलित करेगा:
वंशानुक्रम के लाभ: |
---|
|
तो आप उपरोक्त ArithmeticException
4 ब्लॉकों में से किसी एक को पकड़ सकते हैं।catch
उदाहरण 1:
कोड | कंसोल आउटपुट |
---|---|
|
|
इस उदाहरण में, और ब्लॉक ArithmeticException
दोनों द्वारा पकड़ा जा सकता है । यह ब्लॉक के निकटतम ब्लॉक द्वारा पकड़ा जाएगा - पहला ब्लॉक।catch (Exception e)
catch (ArithmeticException e)
try
catch
आश्चर्य से बचने के लिए, ब्लॉकों की सूची के अंत के पास ब्लॉक रखना सबसे अच्छा है catch
जो लगभग हर अपवाद को पकड़ सकता है ।catch
प्रकार आमतौर पर जावा में हर संभावित अपवाद को पकड़नेThrowable
में सक्षम होता है । यदि आप इसे पहले ब्लॉक में रखते हैं, तो कोड कंपाइल नहीं होगा, क्योंकि कंपाइलर जानता है कि कोड के अगम्य ब्लॉक हैं।catch
GO TO FULL VERSION