2010-07-14 14 views
5

मैं एक स्थिर सेटर कि MyClass के सभी उदाहरणों स्थापित करने के लिए प्रयोग किया जाता है है फेंक सकता है:जावा: बनाएं स्थिर वर्ग के सदस्य जिसका निर्माता एक अपवाद

public class MyClass { 
     .... 
    protected static final Setter setter = new Setter(); 
     ... 
} 

हालांकि इस संकलन नहीं करता है के बाद से सेटर निर्माता एक अपवाद फेंकता है:

public class Setter { 

    public Setter() throws FileNotFoundException { 
      .... 
    } 
} 

मैं इसके आसपास कैसे काम कर सकता हूं?

+0

आम तौर पर यदि कोई चेक अपवाद फेंकता है, तो ऐसा कुछ नहीं है जिसे आप स्थिर में स्टोर करना चाहते हैं। –

उत्तर

17

ExceptionInInitializerError वास्तव में इस उद्देश्य के लिए बनाया गया है। यहां लिंक किए गए जावाडोक से प्रासंगिकता का एक उद्धरण दिया गया है:

सिग्नल जो एक स्थिर प्रारंभकर्ता में एक अप्रत्याशित अपवाद हुआ है। एक ExceptionInInitializerError यह इंगित करने के लिए फेंक दिया गया है कि एक स्थिर प्रारंभकर्ता या स्थिर चर के लिए प्रारंभकर्ता के मूल्यांकन के दौरान एक अपवाद हुआ।

एक स्थिर प्रारंभकर्ता ब्लॉक में असाइनमेंट लपेटें और तदनुसार संभाल लें।

public class MyClass { 
    protected static final Setter setter; 

    static { 
     try { 
      setter = new Setter(); 
     } catch (FileNotFoundException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
    } 
} 
2

आप इसे स्थैतिक फ़ंक्शन के भीतर बना सकते हैं, जब तक आप इसे अपवाद (संभावित रूप से) उठाते हैं।

public class MyClass { 
    protected static final Setter setter = createSetter(); 

    protected static Setter createSetter() { 
     try { 
      return new Setter(); 
     } catch(FileNotFoundException e) { 
      // handle it appropriately 
      return null; 
     } 
    } 
} 

वहाँ अपवाद प्रचार करने के लिए अनुमति देने के लिए कोई रास्ता नहीं है, क्योंकि यह एक जाँच अपवाद को जन्म देती है (और है कि प्रारंभ के दौरान गैरकानूनी है) है। जानने के कुछ तरीके कि से निपटने के लिए है:

  • बढ़ाएं एक अनियंत्रित अपवाद: इस का कारण बनता है एक java.lang.ExceptionInInitializerError उठाया पाने के लिए जब यह वर्ग लोड करने के लिए कोशिश करता है। यह भ्रमित हो सकता है, और पता लगाने और डीबग करने के लिए मुश्किल हो सकता है। मैं इसकी सिफारिश नहीं करता हूं।

  • यह एक गैर अंतिम चर को बदलें, और यह उपयोग करने के लिए एक समारोह बनाने के लिए: चर के गैर अंतिम, आप देख सकते हैं कि इसे पाने में सेट है, और अगर यह नहीं है की जाँच की अपवाद बढ़ा देते हैं। यह अनुमति देता है जहां यह कहा जाता है पर अपवाद को संभालने के लिए (वास्तव में, की आवश्यकता है) अपने कोड:


public class MyClass { 
    private static Setter setter; 

    protected static synchronized Setter getSetter() raises FileNotFoundException { 
     if setter == null { 
      setter = new Setter(); 
     } 

     return setter; 
    } 
} 
+0

क्या होगा यदि यह एक घातक त्रुटि है और इसे प्रसारित करना चाहिए? – sixtyfootersdude

+0

@sixtyfootersdude: इसे एक अनचेक उत्तेजना में लपेटें। –

संबंधित मुद्दे