विज्ञापन
प्रोग्रामिंग में एक अपवाद कार्यक्रम के निष्पादन में कुछ बिंदु पर एक असाधारण स्थिति का प्रतीक है। इसका उपयोग तब किया जाता है जब असाधारण स्थिति को सामना करने के बजाय कहीं और बेहतर तरीके से संभाला जा सकता है। निम्नलिखित उदाहरणों पर विचार करें:
- कॉन्फ़िगरेशन फ़ाइल खोलने में विफलता को बेहतर तरीके से कोड में उच्च संभाला जा सकता है, शायद एक वैकल्पिक कॉन्फ़िगरेशन फ़ाइल स्थान का उपयोग करके।
- एक्सेस करना a सरणी आइटम Java ArrayList का उपयोग कैसे करेंएक जावा सरणी सूची एक सामान्य प्रयोजन के लिए रहने योग्य सरणी है। यह आमतौर पर अन्य भाषाओं में सरणियों से अपेक्षित अधिकांश सुविधाएं प्रदान करता है। इस लेख में आप एक सरणी सूची को सेट करना और उसका उपयोग करना सीखेंगे। अधिक पढ़ें सरणी के सीमा के बाहर एक प्रोग्राम बग को दर्शाता है। खुश डिबगिंग!
- XML पार्सिंग त्रुटि को उपयोगकर्ता के ध्यान में लाया जाना चाहिए ताकि XML फ़ाइल को ठीक किया जा सके।
- मेमोरी से बाहर चल रहे प्रोग्राम (शायद किसी बड़ी फ़ाइल को संसाधित करते समय) को जावा प्रक्रिया के लिए उपलब्ध स्मृति की मात्रा में वृद्धि करके ठीक किया जा सकता है।
इन सभी मामलों में (और अधिक), अपवाद को उस स्थान के बाहर संभाला जाना चाहिए जहां यह उत्पन्न होता है ताकि अंतर्निहित कारण का पता चल सके।
अपवाद के प्रकार
नीचे दी गई छवि जावा अपवाद पदानुक्रम के मुख्य भागों को दिखाती है। आधार वर्ग है फेंकने योग्य जो उप-वर्गीय है अपवाद तथा त्रुटि. कक्षा अपवाद कार्यक्रम से संबंधित स्थितियों के लिए है कि आवेदन स्थिति को उबारने के प्रयास में पकड़ सकते हैं। कक्षा त्रुटिदूसरी ओर, जावा रन-टाइम एनवायरनमेंट में गंभीर त्रुटियों को इंगित करने के लिए है, जो अनुप्रयोगों को नहीं पकड़ना चाहिए। कुछ उदाहरण निम्न हैं: बाहर स्मृति त्रुटि तथा StackOverflowError.
एक अपवाद फिर से दो प्रकार का होता है: जाँच और अनियंत्रित। कॉलिंग कोड द्वारा एक चेक किए गए अपवाद को नियंत्रित किया जाना चाहिए। यह नियम जावा कंपाइलर द्वारा लागू किया गया है। दूसरी ओर, एक अनियंत्रित अपवाद, स्पष्ट रूप से घोषित किए बिना कॉल श्रृंखला को प्रचारित किया जा सकता है। नीचे दिए गए उदाहरण स्पष्ट करेंगे।
अपवादों की जाँच की
निम्न विधि बनाने का प्रयास करता है FileReader एक फ़ाइल से। कंस्ट्रक्टर चेक किए गए अपवाद को फेंकता है FileNotFoundException जिसे कॉलिंग कोड द्वारा नियंत्रित किया जाना चाहिए या फेंक दिया जाना चाहिए।
निम्नलिखित कोड होगा नहीं संकलित करें क्योंकि यह न तो करता है।
निजी शून्य लोडफ़िले (स्ट्रिंग फ़ाइल नाम) {FileReader in = नया FileReader (फ़ाइल नाम); }
कोड को संकलित करने का एक तरीका अपवाद को संभालना है (नीचे देखें)।
निजी शून्य लोडफ़िले (स्ट्रिंग फ़ाइल नाम) {try {FileReader in = new FileReader (फ़ाइल नाम)); {} कैच (FileNotFoundException पूर्व) {// हैंडल अपवाद यहाँ} }
यदि अपवाद को सीधे कॉलर द्वारा नियंत्रित नहीं किया जा सकता है, तो इसे विधि हस्ताक्षर में घोषित किया जाना चाहिए।
निजी शून्य लोडफाइल (स्ट्रिंग फ़ाइल नाम) java.io फेंकता है FileNotFoundException। {FileReader in = नया FileReader (फ़ाइल नाम)); { }
अनियंत्रित अपवाद
एक अनियंत्रित अपवाद वह है जिसे से उप-वर्गित किया गया है क्रम अपवाद और सीधे तौर पर या ऊपर घोषित किए जाने की आवश्यकता नहीं है। उदाहरण के लिए, निम्न कोड में परिणाम है शून्य सूचक अपवाद, जो एक प्रकार का है क्रम अपवाद. कोड, हालांकि त्रुटि के बिना संकलित करता है शून्य सूचक अपवाद एक अनियंत्रित अपवाद है।
निजी शून्य संभाल () {स्ट्रिंग नाम = अशक्त; अगर (name.length ()> 0) {} }
रैपिंग अपवाद
जाँच की गई और अनियंत्रित अपवादों के बारे में उपरोक्त चर्चा को देखते हुए, यह प्रतीत होता है कि अनियंत्रित अपवादों से निपटना आसान है क्योंकि आपको उन्हें घोषित करना या उन्हें स्वयं संभालना नहीं है। उस सुविधा को ध्यान में रखते हुए, कभी-कभी अनियंत्रित अपवाद में चेक किए गए अपवाद को लपेटना उपयोगी हो सकता है।
निम्नलिखित कोड उदाहरण दिखाया गया है कि अपवाद को कैसे लपेटना है। विधि method_1 () फेंकता है SQLException इसके शरीर में कोड को सही तरीके से संकलित करने के लिए, अपवाद को फेंकने की घोषणा की जानी चाहिए।
निजी शून्य विधि 1 () SQLException {... को फेंकता है नई SQLException फेंकें; }
जब इस विधि को किसी अन्य विधि से लागू किया जाता है (method_2 ()), वह तरीका पकड़ सकता है SQLException और इसे एक अनियंत्रित अपवाद के अंदर लपेटें, इसलिए इसे इसके विधि हस्ताक्षर में अपवाद घोषित करने की आवश्यकता नहीं है।
निजी शून्य विधि_2 () {कोशिश {मेथड_1 (); } पकड़ (java.sql) SQLException ex) {नया RuntimeException (पूर्व) फेंकें; } }
अपवाद स्टैक ट्रेस
एक अपवाद स्टैक ट्रेस सक्रिय स्टैक फ़्रेम की सरणी को संदर्भित करता है, जिनमें से प्रत्येक एक विधि आह्वान का प्रतिनिधित्व करता है, जिस समय अपवाद फेंका गया था उस समय जेवीएम द्वारा कब्जा कर लिया गया था। प्रत्येक स्टैक फ्रेम में क्लास नाम, विधि नाम, और संभवतः जावा स्रोत फ़ाइल नाम और लाइन नंबर सहित फ़ाइल के भीतर विधि आह्वान का स्थान शामिल है। यह कॉल के अनुक्रम को वापस ट्रेस करने के लिए उपयोगी है जिसके कारण त्रुटि हुई जावा अपवाद: क्या आप उन्हें सही संभाल रहे हैं?प्रोग्रामिंग में एक अपवाद कार्यक्रम के निष्पादन में एक असाधारण स्थिति को दर्शाता है। इसका उपयोग तब किया जाता है जब स्थिति को कहीं और बेहतर तरीके से संभाला जा सकता है। जावा अपवाद हैंडलिंग के निम्नलिखित उदाहरणों पर विचार करें। अधिक पढ़ें .
यहां एक विशिष्ट स्टैक ट्रेस है, जब इसे पकड़ा गया था तो अपवाद ऑब्जेक्ट से प्राप्त किया गया था।
थ्रेड "मुख्य" जावा में अपवाद। IndexOutOfBoundsException: इंडेक्स: 8, आकार: 5 java.util पर। ArrayList.rangeCheck (ArrayList.java: 653) java.util पर। ArrayList.get (ArrayList.java: 429) sample.sample1.main पर (sample1.java: 24)
यहां पकड़ा गया अपवाद है IndexOutOfBoundsException. इसमें त्रुटि के बारे में अतिरिक्त जानकारी शामिल है। स्टैक ट्रेस में 3 स्टैक फ़्रेम होते हैं, जिनमें से प्रत्येक में दिखाए गए अनुसार स्थान की जानकारी शामिल होती है।
अपवादों को संभालना
एक अपवाद को एक में पकड़कर नियंत्रित किया जा सकता है पकड़ने की कोशिश ब्लॉक करें और जो भी सुधारात्मक कार्रवाई की आवश्यकता हो, ले। अपवाद ऑब्जेक्ट उस स्थिति के बारे में जानकारी निकालने के लिए कई तरीके प्रदान करता है जिसके कारण यह हुआ।
निम्न कोड एक लॉग फ़ाइल में त्रुटि संदेश को लॉग करता है।
निजी शून्य लोडकॉन्फ़िग () {कोशिश {// चालान कोड जो IOException} कैच (j.b.) उत्पन्न कर सकता है। IOException ex) {// यहां अपवाद को संभालें। लॉग फ़ाइल में लॉग किया जा सकता है। log.warning (ex.getMessage ()); } }
जब एक अपवाद दूसरे के अंदर लपेटा जाता है, तो आप लिपटे अपवाद को पुनः प्राप्त कर सकते हैं:
फेंकने का कारण = ex.getCause (); log.warning ("अंडरस्टैंडिंग कारण:" + reason.getMessage ());
क्या आपको स्टैक ट्रेस तक पहुंचने की आवश्यकता है, और संभवत: उस विधि का नाम निकालें जो इसकी वजह थी?
StringBuilder sbuf = नया StringBuilder ("स्टैक ट्रेस:"); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "।" + el.getMethodName ())। परिशिष्ट ("\ n"); } log.warning (sbuf.toString ());
या हो सकता है, अपवाद को लॉग इन करें और इसे फिर से डालें?
प्रयत्न {... } पकड़ (java.io. IOException पूर्व) {log.warning (ex.getMessage ()); पूर्व फेंक; }
अपवाद कक्षा एक प्रदान करता है printStackTrace () विधि जो अपने आप स्टैक ट्रेस को प्रिंट कर सकती है PrintStream (या PrintWriter).
प्रयत्न {... } पकड़ (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (आउट); }
आप एकल में कई प्रकार के अपवादों को पकड़ सकते हैं प्रयत्न ब्लॉक करें, और प्रत्येक प्रकार के अपवाद के लिए विशिष्ट हैंडलिंग करें।
यहाँ कुछ अपवादों को फेंकता है। } पकड़ (java.io. IOException पूर्व) {// IOException विशिष्ट हैंडलिंग यहाँ। } पकड़ (java.sql) SQLException ex) {// SQLException विशिष्ट हैंडलिंग यहां। }
कई अपवाद प्रकारों को पकड़ने के लिए लेकिन समान हैंडलिंग कोड का उपयोग करने के लिए, आप एक घोषणा कर सकते हैं पकड़ निम्नानुसार कई प्रकारों के साथ ब्लॉक करें:
यहाँ कुछ अपवादों को फेंकता है। } पकड़ (java.io. IOException | java.sql। SQLException ex) {// IOException और SQLException विशिष्ट हैंडलिंग यहां। } पकड़ (SAXException पूर्व) {// SAXException विशिष्ट हैंडलिंग यहाँ। }
अंत में संसाधनों की सफाई
जब कोड अपवादों को फेंक सकता है, तो किसी भी संसाधन की उचित सफाई करना आवश्यक है, जैसे कि खुली हुई फाइलें सब कुछ आप फ़ाइल स्वरूपों और उनके गुणों के बारे में पता करने की आवश्यकता हैहम शब्द फ़ाइल को परस्पर उपयोग करते हैं: संगीत, छवि, स्प्रेडशीट, स्लाइड शो, और इसी तरह। लेकिन क्या एक फ़ाइल "फ़ाइल", वैसे भी बनाता है? आइए कंप्यूटिंग के इस मूल भाग को देखें और समझें। अधिक पढ़ें , डेटाबेस कनेक्शन, आदि। संसाधन सफाई का प्रदर्शन किया जाना चाहिए आखिरकार खंड मैथा। इस तरह से एक ब्लॉक से सामान्य निकास और असाधारण निकास दोनों ही आह्वान करते हैं सफाई कोड इतिहास में 10 सबसे खराब प्रोग्रामिंग गलतियाँइसके अतीत में, विनाश को भी नष्ट कर दिया। थोड़े से खराब कोड के उदाहरणों के कारण बड़े स्तर पर आपदा आई। इतिहास में सबसे खराब प्रोग्रामिंग गलतियों में से 10 निम्नलिखित हैं। अधिक पढ़ें .
InputStream = null; प्रयत्न {... in = नया FileInputStream (फ़ाइल नाम);... } पकड़ (java.io. IOException पूर्व) {log.warning (ex.getMessage ()); } अंत में {// कोड यहाँ कोशिश ब्लॉक से बाहर निकलने पर निष्पादित किया जाता है, // सामान्य रूप से या अपवाद के कारण यदि (; = null) in.close (); }
कोशिश-साथ-संसाधन ब्लॉक
Java 1.7 को पेश किया गया कोशिश-साथ-संसाधनों निर्माण जो संसाधन सफाई को आसान बनाता है। यह इस तरह दिख रहा है:
try (InputStream = new FileInputStream (..)) {// कोड जो InputStream का उपयोग करता है। }
जब कोड ब्लॉक से बाहर निकलता है (चाहे साफ़ या अपवाद के कारण), तो आगत प्रवाह चर स्वचालित रूप से साफ किया जाता है।
ब्लॉक के प्रमुख में सभी को घोषित करके कई संसाधनों की सफाई करें।
try (InputStream = new FileInputStream (..); कनेक्शन con =...; ) {// कोड जो इनपुटस्ट्रीम और कनेक्शन का उपयोग करता है। }
कोई भी वस्तु जिसका वर्ग कार्यान्वित करता है AutoCloseable इंटरफ़ेस को इस तरीके से साफ किया जा सकता है। निम्न वर्ग में कुछ विशिष्ट सफाई करता है बंद करे() तरीका।
सार्वजनिक वर्ग MyClass लागू करता है AutoCloseable {सार्वजनिक शून्य पास () {// सफाई कोड यहाँ} }
इस वर्ग के उदाहरण का उपयोग करें a कोशिश-साथ-संसाधनों खंड मैथा।
try (MyClass obj = new MyClass (..)) {// कोड जो MyClass ऑब्जेक्ट का उपयोग करता है। }
कुछ आम तौर पर एनकाउंटर किए गए अपवाद
आइए अब कुछ सामान्य रूप से सामना किए गए अपवादों पर एक नज़र डालें।
- IndexOutOfBoundsException (अनियंत्रित): इंगित करता है कि तत्व का इंडेक्स एक्सेस किया जा रहा है, किसी सरणी, स्ट्रिंग आदि की सीमा से बाहर है।
- SQLException (चेक किया गया): डेटाबेस त्रुटि के कारण फेंका गया।
- IOException (चेक किया गया): इनपुट और आउटपुट के साथ फाइल एक्सेस एरर या एरर।
- InterruptedException (चेक किया गया): थ्रेड निष्पादन में बाधा आने पर फेंक दिया जाता है।
- SAXException (चेक किया गया): XML पार्सिंग त्रुटियों के कारण फेंका गया।
- शून्य सूचक अपवाद (अनियंत्रित): अशक्त का उपयोग करना जहां एक वस्तु की आवश्यकता होती है।
समेट रहा हु
अपवाद जावा में त्रुटि रिपोर्टिंग और प्रबंधन के लिए प्राथमिक विधि है। अपवादों का उचित उपयोग कोड की गुणवत्ता में वृद्धि कस्टम थीम्स के साथ अपने लिनक्स टेक्स्ट एडिटर में तेज़ या लिखेंआपके लिनक्स टेक्स्ट एडिटर को नीरस और "कार्यात्मक" नहीं दिखना है। अपनी उत्पादकता को बढ़ाने के लिए इसे ट्विक क्यों नहीं किया जाता है, क्या स्क्रिप्टिंग और कोडिंग या टूलअप को मार्कअप संपादक के रूप में उपयोग करना? अधिक पढ़ें और उत्पादन में मुद्दों को हल करने में मदद करते हैं।
क्या आपके पास कोई अपवाद-संबंधित युद्ध की कहानियां हैं? यदि हां, तो हमें नीचे टिप्पणी अनुभाग में इसके बारे में बताएं।
इमेज क्रेडिट: शटरस्टॉक डॉट कॉम के माध्यम से दिमित्री निकोलेव