हम जावा में कस्टम अपवाद कैसे बना सकते हैं?
हम जावा में कस्टम अपवाद कैसे बना सकते हैं?
जवाबों:
चेक किए गए अपवाद को परिभाषित करने के लिए आप एक उपवर्ग (या उपवर्गों का पदानुक्रम) बनाते हैं java.lang.Exception
। उदाहरण के लिए:
public class FooException extends Exception {
public FooException() { super(); }
public FooException(String message) { super(message); }
public FooException(String message, Throwable cause) { super(message, cause); }
public FooException(Throwable cause) { super(cause); }
}
इस अपवाद को संभावित रूप से फेंक या प्रचारित करने वाली विधियाँ इसे घोषित करनी चाहिए:
public void calculate(int i) throws FooException, IOException;
... और इस पद्धति को कॉल करने वाले कोड को या तो इस अपवाद को संभालना या प्रचारित करना चाहिए (या दोनों):
try {
int i = 5;
myObject.calculate(5);
} catch(FooException ex) {
// Print error and terminate application.
ex.printStackTrace();
System.exit(1);
} catch(IOException ex) {
// Rethrow as FooException.
throw new FooException(ex);
}
आप उपरोक्त उदाहरण पर ध्यान देंगे जो IOException
पकड़ा गया है और जैसा कि पुनर्विचार किया गया है FooException
। यह एक सामान्य तकनीक है जिसका उपयोग अपवादों को अलग करने के लिए किया जाता है (आमतौर पर एपीआई लागू करते समय)।
कभी-कभी ऐसी परिस्थितियाँ होंगी, जहाँ आप अपने अपवाद कार्यान्वयन को घोषित करने के लिए हर विधि को उसके फेंके हुए खंड में लागू नहीं करना चाहते। इस मामले में आप एक अनियंत्रित अपवाद बना सकते हैं । एक अनियंत्रित अपवाद कोई भी अपवाद है जो विस्तारित होता है java.lang.RuntimeException
(जो स्वयं एक उपवर्ग है java.lang.Exception
):
public class FooRuntimeException extends RuntimeException {
...
}
विधियाँ FooRuntimeException
इसे घोषित किए बिना अपवाद को फेंक या प्रचारित कर सकती हैं; जैसे
public void calculate(int i) {
if (i < 0) {
throw new FooRuntimeException("i < 0: " + i);
}
}
अनियंत्रित अपवाद आमतौर पर एक प्रोग्रामर त्रुटि को निरूपित करने के लिए उपयोग किया जाता है, उदाहरण के लिए एक विधि के लिए एक अमान्य तर्क पारित करने या एक सरणी सूचकांक सीमा को भंग करने का प्रयास करने के लिए।
java.lang.Throwable
वर्ग सभी त्रुटियों और अपवादों कि जावा के भीतर फेंकी जा सकती है की जड़ है। java.lang.Exception
और java.lang.Error
दोनों उपवर्ग हैं Throwable
। जो कुछ भी उपवर्गों Throwable
को फेंका या पकड़ा जा सकता है। हालाँकि, यह आमतौर पर पकड़ने या फेंकने के लिए बुरा अभ्यास है Error
क्योंकि इसका उपयोग जेवीएम के लिए आंतरिक त्रुटियों को दर्शाने के लिए किया जाता है जो आमतौर पर प्रोग्रामर (जैसे OutOfMemoryError
) द्वारा "नियंत्रित" नहीं किया जा सकता है । इसी तरह आपको पकड़ने से बचना चाहिए Throwable
, जिसके परिणामस्वरूप आपको Error
एस के अलावा एस भी पकड़ सकता है Exception
।
चेक किए गए अपवाद के लिए:
public class MyCustomException extends Exception { }
तकनीकी रूप से, जो कुछ भी विस्तारित होता है Throwable
वह एक फेंक दिया जा सकता है, लेकिन अपवाद आम तौर पर Exception
वर्ग के विस्तार होते हैं ताकि वे अपवादों की जांच कर सकें (इसके आधार पर रनटाइम एक्ससेप्शन या कक्षाएं, जो कि जाँच नहीं की जाती हैं), अन्य सामान्य प्रकार के थ्रोबल के विपरीत। Error
s जो आमतौर पर JVM इंटर्नल से परे शान से संभाले जाने के लिए डिज़ाइन नहीं किया जाता है।
आप अपवादों को गैर-सार्वजनिक भी कर सकते हैं, लेकिन तब आप उनका उपयोग केवल उन्हीं पैकेजों में कर सकते हैं जो उन्हें परिभाषित करते हैं, जैसा कि पूरे पैकेजों के विपरीत होता है।
जहां तक कस्टम अपवादों को फेंकने / पकड़ने की बात है, यह बिल्ट-इन जैसे ही काम करता है
throw new MyCustomException()
और के माध्यम से पकड़
catch (MyCustomException e) { }
Throwable
उसे फेंक दिया जा सकता है ; अपवादों का विस्तार होता है Exception
। थ्रोबल के एक कस्टम उपवर्ग को एक try { ... } catch (Exception e) { ... }
ब्लॉक द्वारा नहीं पकड़ा जाएगा ।
Error
नहीं है, यह एक त्रुटि है)। 3) इसका मतलब यह है कि अपवाद के किसी भी उपवर्ग की जाँच की जाती है, जबकि RuntimeException नहीं है। अदमस्की द्वारा दिया गया उत्तर अधिक सटीक है!