जावा में कस्टम अपवाद वर्ग को कैसे परिभाषित करें, सबसे आसान तरीका?


286

मैं अपने स्वयं के अपवाद वर्ग को सबसे आसान तरीके से परिभाषित करने की कोशिश कर रहा हूं, और यही मुझे मिल रहा है:

public class MyException extends Exception {}

public class Foo {
  public bar() throws MyException {
    throw new MyException("try again please");
  }
}

यह जावा कंपाइलर का कहना है:

cannot find symbol: constructor MyException(java.lang.String)

मुझे लग रहा था कि इस निर्माता से विरासत में मिली है java.lang.Exception, है ना?

जवाबों:


402

नहीं, आप गैर-डिफ़ॉल्ट निर्माणकर्ताओं को "विरासत में" नहीं देते हैं, आपको अपनी कक्षा में स्ट्रिंग लेने वाले को परिभाषित करने की आवश्यकता है। आमतौर पर आप super(message)अपने कंस्ट्रक्टर में अपने माता-पिता के कंस्ट्रक्टर का इस्तेमाल करते हैं। उदाहरण के लिए, इस तरह:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

58
@vulkanino: नहीं। डिफॉल्ट कंस्ट्रक्टर को कंपाइलर द्वारा हर वर्ग के लिए जोड़ा जाता है जो अपने स्वयं के किसी भी कंस्ट्रक्टर को परिभाषित नहीं करता है। यदि आप एक स्पष्ट कंस्ट्रक्टर को परिभाषित करते हैं, तो सुपरक्लास के पास होने पर भी आपको डिफ़ॉल्ट नहीं मिलता है, और यदि आपकी कक्षा में कोई कंस्ट्रक्टर नहीं है, तो आपको सुपरक्लास नहीं होने पर भी डिफॉल्ट मिलता है।
माइकल बोर्गवर्ड्ट

5
if your class has no constructor, you get the default even if the superclass does not have itअंतिम भाग असंभव है, जब तक कि सुपरक्लास में एक डिफ़ॉल्ट निर्माता नहीं है जो इस वर्ग के लिए सुलभ है (संरक्षित या पैकेज-संरक्षित हो सकता है)। अन्यथा आपको स्पष्ट रूप से मूल रचनाकारों में से एक को कॉल करना होगा, या संकलन विफल हो जाएगा।
सीन पैट्रिक फ्लॉयड

43
कृपया ठीक से अपवादों का समर्थन करने के लिए कृपया MyException(Throwable)और MyException(String, Throwable)निर्माणकर्ताओं को जोड़ें ।
दानिलो पियाज़ालुंगा

8
लगभग 3 साल बाद और अतिरिक्त निर्माणकर्ताओं में से कोई भी जोड़ा नहीं गया है। :(
byxor

2
@BrandonIbbotson 'वे' से आपका क्या तात्पर्य है, और वे कहाँ जोड़े जाते हैं? यदि आप 'वे' से जो मतलब रखते हैं वह सुपरक्लास कंस्ट्रक्टर हैं और 'जहां' उप-वर्ग है, तो आप गलत हैं। सुपरक्लास कंस्ट्रक्टरों को स्पष्ट रूप से उपवर्ग में नहीं जोड़ा जाता है। इसके अलावा, मैं उन शब्दों को संदर्भित करने के लिए पिछले वाक्यों में कोई अन्य विषय नहीं देख सकता।
बजे

90

एक विशिष्ट कस्टम अपवाद जिसे मैं परिभाषित करता हूं वह कुछ इस प्रकार है:

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable throwable) {
        super(message, throwable);
    }

}

मैं ग्रहण का उपयोग करके एक टेम्प्लेट भी बनाता हूं ताकि मुझे बार-बार सारा सामान लिखना न पड़े।


17
आप ग्रहण में अपनी कक्षा बनाते समय अपवाद का विस्तार कर सकते हैं और आपको सभी चार निर्माता मिलेंगे। आपको किसी टेम्पलेट की आवश्यकता नहीं है।
jeremyjjbrown

हमें पहले के बजाय दूसरे कंसट्रक्टर का उपयोग कब करना चाहिए?
झाओगंग

61

यदि आप ग्रहण में नए वर्ग के संवाद का उपयोग करते हैं, तो आप सुपरक्लास क्षेत्र को केवल java.lang.Exception"सुपरक्लास से कंस्ट्रक्टर्स" की जांच कर सकते हैं और यह निम्नलिखित उत्पन्न करेगा:

package com.example.exception;

public class MyException extends Exception {

    public MyException() {
        // TODO Auto-generated constructor stub
    }

    public MyException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public MyException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

}

super()डीफॉल्ट कंस्ट्रक्टर में कॉल न करने के बारे में नीचे दिए गए सवाल के जवाब में, ओरेकल का यह कहना है :

नोट: यदि कोई कंस्ट्रक्टर स्पष्ट रूप से सुपरक्लास कंस्ट्रक्टर को लागू नहीं करता है, तो जावा कंपाइलर सुपरक्लास के नो-लॉजिक कंस्ट्रक्टर को स्वचालित रूप से एक कॉल सम्मिलित करता है।


1
डिफ़ॉल्ट निर्माता को कॉल करने के लिए यह आवश्यक क्यों नहीं है super()?
ceving


22

इसका कारण जावा प्लेटफ़ॉर्म के इनहेरिटेंस लेख में बताया गया है जो कहता है:

"एक उपवर्ग अपने सुपरक्लास से सभी सदस्यों (क्षेत्रों, विधियों, और नेस्टेड वर्गों) को विरासत में मिला है । निर्माणकर्ता सदस्य नहीं हैं , इसलिए उन्हें उपवर्गों द्वारा विरासत में नहीं मिला है, लेकिन सुपरक्लास के निर्माता को उपवर्ग से आमंत्रित किया जा सकता है।"


19
package customExceptions;

public class MyException extends Exception{

    public MyException(String exc)
    {
        super(exc);
    }
    public String getMessage()
    {
        return super.getMessage();
    }
}

import customExceptions.MyException;

public class UseCustomException {

    MyException newExc=new MyException("This is a custom exception");

    public UseCustomException() throws MyException
    {
        System.out.println("Hello Back Again with custom exception");
        throw newExc;       
}

    public static void main(String args[])
    {
        try
        {
            UseCustomException use=new UseCustomException();
        }
        catch(MyException myEx)
        {
            System.out.println("This is my custom exception:" + myEx.getMessage());
        }
    }
}

यह क्या लौटेगा?
user1876508

यह सिर्फ "कस्टम अपवाद के साथ हैलो बैक अगेन" का प्रिंट आउट लेगा, जो कि UseCusomException के लिए कंस्ट्रक्टर से है, अपवाद को तब मुख्य रूप से पकड़ा जाएगा जो प्रिंट आउट होगा "यह मेरा कस्टम अपवाद है: यह एक कस्टम अपवाद है"।
thePerson

2

एक्सेप्शन क्लास में दो कंस्ट्रक्टर होते हैं

  • public Exception() - यह बिना किसी अतिरिक्त जानकारी के एक अपवाद का निर्माण करता है। अपवाद के अलावा आमतौर पर वर्ग नाम से अनुमान लगाया जाता है।
  • public Exception(String s) - निर्दिष्ट त्रुटि संदेश के साथ एक अपवाद का निर्माण करता है। विस्तार संदेश एक स्ट्रिंग है जो इस विशेष अपवाद के लिए त्रुटि स्थिति का वर्णन करता है।

3
दरअसल, जावा 1.4 के बाद से, दो और निर्माता हैं: public Exception(Throwable)और public Exception(String, Throwable)। उन्हें ठीक से अपवादों का समर्थन करने की आवश्यकता है ।
दानिलो पियाज़ालुंगा

@DaniloPiazzalunga आपसे सहमत है। स्रोत: कंस्ट्रक्टर सारांश docs.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html
KNU

0

यदि आपको अपवाद से विरासत में मिला है, तो आपको एक कंस्ट्रक्टर प्रदान करना होगा जो एक स्ट्रिंग को एक पैरामीटर के रूप में लेता है (इसमें त्रुटि संदेश शामिल होगा)।


मुझे लगता है कि आपको कारण भी जोड़ना चाहिए।
जिगर जोशी

3
वास्तव में, यह गलत है। यदि आपका कोड एक स्ट्रिंग तर्क के साथ एक कंस्ट्रक्टर का उपयोग करता है, तो आपको इसे घोषित करना होगा। हालांकि, एक अपवाद उपवर्ग को बिना किसी स्पष्ट निर्माणकर्ता के साथ परिभाषित किया जा सकता है ... क्योंकि अपवाद में एक बिना आर्गन के निर्माता नहीं है।
स्टीफन सी

0

और एक अपवाद फेंकने का सबसे आसान तरीका मत भूलना (आपको एक वर्ग बनाने की आवश्यकता नहीं है)

if (rgb > MAX) throw new RuntimeException("max color exceeded");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.