2009-11-18 15 views
133

हम जावा में कस्टम अपवाद कैसे बना सकते हैं?जावा में कस्टम अपवाद कैसे बनाएं?

+2

यह ओओ भाषाओं में उपयोग की जाने वाली वही पद्धति है: आधार अपवाद वर्ग का विस्तार करें। – NDM

+2

देखें http://stackoverflow.com/questions/1070590/how-can-i-write-an-exception-by-myself – demongolem

उत्तर

253

एक आप 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 रूप rethrown में ध्यान देंगे। यह अपवादों को समाहित करने के लिए उपयोग की जाने वाली एक आम तकनीक है (आमतौर पर जब एपीआई लागू होती है)।

कभी-कभी ऐसी परिस्थितियां भी होंगी जहां आप प्रत्येक विधि को अपने फेंकने वाले खंड में अपवाद कार्यान्वयन की घोषणा नहीं करना चाहते हैं। इस मामले में आप अनचेक अपवाद बना सकते हैं। एक अनियंत्रित अपवाद किसी भी अपवाद है कि 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.ErrorThrowable दोनों के उप-वर्ग हैं। Throwable उपखंड जो कुछ भी फेंक दिया या पकड़ा जा सकता है। हालांकि, यह आमतौर पर Error को पकड़ने या फेंकने के लिए खराब अभ्यास है क्योंकि इसका उपयोग जेवीएम में आंतरिक त्रुटियों को इंगित करने के लिए किया जाता है जिसे प्रोग्रामर द्वारा आमतौर पर "संभाला" नहीं जा सकता है (उदा। OutOfMemoryError)। इसी प्रकार आपको Throwable को पकड़ने से बचना चाहिए, जिसके परिणामस्वरूप आप Error एस Exception एस के अलावा प्राप्त कर सकते हैं।

6
एक जाँच अपवाद के लिए

:

public class MyCustomException extends Exception { } 

तकनीकी तौर पर, कुछ भी है कि Throwable फैली एक फेंक दिया हो सकता है, लेकिन आम तौर पर अपवाद Exception वर्ग के एक्सटेंशन रहे हैं ताकि वे जांचे हुए अपवादों (RuntimeException या वर्गों को छोड़कर के आधार पर कर रहे हैं यह, जो चेक नहीं किए जाते हैं), अन्य सामान्य प्रकार के फेंकने योग्य, Error एस के विपरीत जो आम तौर पर जेवीएम आंतरिक से परे सुन्दर तरीके से संभाले जाने के लिए डिज़ाइन नहीं किए गए हैं।

आप गैर-सार्वजनिक अपवाद भी बना सकते हैं, लेकिन फिर आप उन्हें पैकेज में उपयोग कर सकते हैं जो उन्हें परिभाषित करता है, जैसा कि पूरे पैकेज के विपरीत है।

जहाँ तक फेंकने/कस्टम अपवाद को पकड़ने के रूप में, यह सिर्फ निर्मित लोगों की तरह काम करता है - के माध्यम से

throw new MyCustomException() 

फेंक और के रूप में के माध्यम से इसे

catch (MyCustomException e) { } 
+3

रनटाइम अपवाद अपवाद बढ़ाता है और चेक अपवाद नहीं है। – Adamski

+2

तकनीकी रूप से, जो भी 'थ्रोबल' बढ़ाता है उसे * फेंक दिया जा सकता है *; अपवाद 'अपवाद' का विस्तार करते हैं। थ्रोबल का एक कस्टम उप-वर्ग 'try {...} पकड़ (अपवाद ई) {...} 'ब्लॉक द्वारा पकड़ा नहीं जाएगा। –

+0

लोग इस उत्तर को क्यों उखाड़ रहे हैं? इसमें कुछ त्रुटियां हैं। 1) आप * इम्प्लेमेनेट * फेंकने योग्य नहीं कर सकते क्योंकि यह एक इंटरफ़ेस है। 2) कुछ भी जो * * फेंकने योग्य * ** ** एक अपवाद नहीं है ('त्रुटि 'अपवाद नहीं है, यह एक त्रुटि है)। 3) इसका तात्पर्य है कि अपवाद के किसी भी उप-वर्ग की जांच की जाती है जबकि रनटाइम अपवाद नहीं है। एडमस्की द्वारा दिए गए उत्तर अधिक सटीक हैं! –

23
public class MyException extends Exception { 
     // special exception code goes here 
} 

फेंक पकड़ने:

throw new MyException ("Something happened") 

इस प्रकार पकड़ें:

catch (MyException e) 
{ 
    // something 
} 
संबंधित मुद्दे