इस ट्यूटोरियल में, हम उदाहरणों की मदद से जावा में कई अपवादों को संभालना सीखेंगे।
जावा 7 से पहले, हमें कोड अतिरेक होने पर भी विभिन्न प्रकार के अपवादों के लिए कई अपवाद हैंडलिंग कोड लिखने पड़ते थे।
एक उदाहरण लेते हैं।
उदाहरण 1: एकाधिक कैच ब्लॉक
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
आउटपुट
/ शून्य से
इस उदाहरण में, दो अपवाद हो सकते हैं:
ArithmeticException
क्योंकि हम एक संख्या को 0 से विभाजित करने का प्रयास कर रहे हैं।ArrayIndexOutOfBoundsException
क्योंकि हमने 0 से 9 की सीमा के साथ एक नया पूर्णांक सरणी घोषित किया है और हम सूचकांक 10 के लिए एक मान निर्दिष्ट करने का प्रयास कर रहे हैं।
हम दोनों catch
ब्लॉक यानी डुप्लिकेट कोड में अपवाद संदेश को प्रिंट कर रहे हैं ।
असाइनमेंट ऑपरेटर की सहानुभूति =
बाएं से दाएं है, इसलिए ArithmeticException
संदेश के साथ पहले शून्य द्वारा फेंक दिया जाता है।
एक पकड़ ब्लॉक में कई अपवादों को संभालें
जावा एसई 7 और बाद में, अब हम एक catch
ब्लॉक में एक से अधिक प्रकार के अपवादों को पकड़ सकते हैं ।
प्रत्येक अपवाद प्रकार जिसे catch
ब्लॉक द्वारा नियंत्रित किया जा सकता है, एक ऊर्ध्वाधर बार या पाइप का उपयोग करके अलग किया जाता है |
।
इसका सिंटैक्स है:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
उदाहरण 2: मल्टी-कैच ब्लॉक
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
आउटपुट
/ शून्य से
एक एकल catch
ब्लॉक में कई अपवादों को पकड़ने से कोड दोहराव कम हो जाता है और दक्षता बढ़ जाती है।
इस प्रोग्राम को संकलित करते समय उत्पन्न किया गया bytecode कई catch
ब्लॉक वाले प्रोग्राम से छोटा होगा क्योंकि इसमें कोई कोड अतिरेक नहीं है।
नोट: यदि कोई catch
ब्लॉक कई अपवादों को संभालता है, तो कैच पैरामीटर अंतर्निहित है final
। इसका मतलब है कि हम मापदंडों को पकड़ने के लिए कोई मान निर्दिष्ट नहीं कर सकते हैं।
आधार अपवाद पकड़ना
जब एक एकल catch
खंड में कई अपवादों को पकड़ा जाता है , तो नियम को विशिष्टीकृत किया जाता है।
इसका मतलब यह है कि यदि catch
ब्लॉक में अपवादों का एक पदानुक्रम है , तो हम केवल कई अपवादों को पकड़ने के बजाय आधार अपवाद को पकड़ सकते हैं।
एक उदाहरण लेते हैं।
उदाहरण 3: केवल आधार वर्ग को पकड़ना
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) )
आउटपुट
/ शून्य से
हम जानते हैं कि सभी अपवाद वर्ग वर्ग के उपवर्ग हैं Exception
। इसलिए, कई विशेष अपवादों को पकड़ने के बजाय, हम बस Exception
वर्ग को पकड़ सकते हैं ।
यदि आधार अपवाद वर्ग पहले से ही catch
ब्लॉक में निर्दिष्ट किया गया है, तो उसी catch
ब्लॉक में बाल अपवाद कक्षाओं का उपयोग न करें । अन्यथा, हम एक संकलन त्रुटि प्राप्त करेंगे।
एक उदाहरण लेते हैं।
उदाहरण 4: आधार और बाल अपवाद कक्षाओं को पकड़ना
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
आउटपुट
Main.java:6: एरर: मल्टी-कैच स्टेटमेंट में अल्टरनेटिव्स सबक्लासिंग से संबंधित नहीं हो सकते
इस उदाहरण में, ArithmeticException
और ArrayIndexOutOfBoundsException
दोनों वर्ग के उपवर्ग हैं Exception
। तो, हम एक संकलन त्रुटि प्राप्त करते हैं।