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


149

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


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

2
बाहर की जाँच करें stackoverflow.com/questions/1070590/…
demongolem

1) // क्लास जो परिभाषित-परिभाषित एक्सपेक्टेशन क्लास का प्रतिनिधित्व करती है MyException एक्सटेंड करती है अपवाद {public MyException (स्ट्रिंग s) {सुपर (s); }} ------------------------------------------------ 2) कोशिश {// उपयोगकर्ता द्वारा परिभाषित अपवाद की एक वस्तु फेंक नई MyException ("TestException") फेंक; } पकड़ (MyException पूर्व) {System.out.println ("पकड़ा"); // MyException ऑब्जेक्ट System.out.println (ex.getMessage ()) से संदेश प्रिंट करें; }
मंदीप यादव

जवाबों:


285

चेक किए गए अपवाद को परिभाषित करने के लिए आप एक उपवर्ग (या उपवर्गों का पदानुक्रम) बनाते हैं 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


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

इसे इस प्रकार फेंकें:

 throw new MyException ("Something happened")

इस प्रकार पकड़ो:

catch (MyException e)
{
   // something
}

4

चेक किए गए अपवाद के लिए:

public class MyCustomException extends Exception { }

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

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

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

throw new MyCustomException()

और के माध्यम से पकड़

catch (MyCustomException e) { }

4
RuntimeException अपवाद का विस्तार करता है और एक जाँच अपवाद नहीं है।
एडम्सकी

2
तकनीकी रूप से, जो कुछ भी विस्तारित होता है Throwableउसे फेंक दिया जा सकता है ; अपवादों का विस्तार होता है Exception। थ्रोबल के एक कस्टम उपवर्ग को एक try { ... } catch (Exception e) { ... }ब्लॉक द्वारा नहीं पकड़ा जाएगा ।
आंद्रेज डोयले

लोग इस उत्तर को क्यों बढ़ा रहे हैं? इसमें कुछ अशुद्धियाँ शामिल हैं। 1) आप एक इंटरफ़ेस के रूप में फेंकने योग्य नहीं लगा सकते हैं । 2) जो कुछ भी थ्रोबेबल का विस्तार करता है वह अपवाद नहीं है (अपवाद Errorनहीं है, यह एक त्रुटि है)। 3) इसका मतलब यह है कि अपवाद के किसी भी उपवर्ग की जाँच की जाती है, जबकि RuntimeException नहीं है। अदमस्की द्वारा दिया गया उत्तर अधिक सटीक है!
oxbow_lakes

उफ़ - मेरा मतलब था कि फेंकने योग्य कोर्स का इंटरफ़ेस नहीं है !
oxbow_lakes

@oxbow_lakes - अशुद्धियों को ठीक करने के लिए आदर्श समाधान होगा, नहीं? किसी भी तरह, मैंने खुद को सही किया है क्योंकि किसी और ने नहीं किया।
अंबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.