2010-08-22 18 views
10

मैं एक एनम कन्स्ट्रक्टर से अपवाद कैसे फेंक सकता हूं? उदाहरण के लिए:एनम कन्स्ट्रक्टर से अपवाद कैसे फेंकें?

public enum RLoader { 
    INSTANCE; 
    private RLoader() throws IOException { 
    .... 
    } 
} 

त्रुटि पैदा करता

क्रिया के अपवाद प्रकार IOException

+6

आप ऐसा क्यों करना चाहते हैं? मेरे लिए यह enum अवधारणा के दुरुपयोग की तरह लगता है। Enum मान स्थिरांक माना जाता है, जिसका निर्माण किसी भी चीज़ पर निर्भर नहीं है। यहां तक ​​कि यदि तकनीकी रूप से आप _could_ ऐसा करते हैं (चेक किए गए के बजाय एक अनचेक अपवाद फेंककर), तो मैं सुझाव दूंगा कि आप अपने डिज़ाइन को संशोधित करें। यदि आप इस enum के माध्यम से सिंगलटन को लागू करने की कोशिश कर रहे हैं, तो इसे सामान्य श्रेणी के रूप में हाथ से लागू करना बेहतर है। –

+2

मैं सिंगलटन को कार्यान्वित कर रहा हूं, लेकिन इसे सामान्य श्रेणी के रूप में हाथ से कैसे कार्यान्वित करना बेहतर होगा? मुझे अभी भी एक स्थिर प्रारंभकर्ता द्वारा बुलाए गए कोड से अपवाद फेंकना होगा। आप एक enum कन्स्ट्रक्टर से अनचेक अपवाद फेंक सकते हैं। – tukushan

+0

केवल एक enum मूल्य तक पहुंचने के द्वारा फेंक दिया अपवाद प्राप्त करने के बारे में कुछ * icky * है। जब यह सिंगलटन getInstance() विधि है तो इतना बुरा नहीं है। –

उत्तर

15

क्योंकि उदाहरणों एक स्थिर प्रारंभकर्ता में बनाए जाते हैं, एक ExceptionInInitializerError बजाय फेंक देते हैं।

+5

हालांकि यह एक संभावित समाधान है, मुझे नहीं लगता कि इस तरह की समस्या को हल करने के लिए यह समझदारी होगी। –

0

वह परिदृश्य काम नहीं कर सकता है।

आप निर्माता से चेक Exception फेंकने की कोशिश कर रहे हैं।

इस निर्माता को INSTANCE enum प्रविष्टि घोषणा द्वारा बुलाया जाता है, इसलिए चेक अपवाद को सही तरीके से संभाला नहीं जा सकता है।

यह भी मेरी राय में एक रचनाकार से अपवादों को फेंकने की बुरी शैली है, क्योंकि एक कन्स्ट्रक्टर को सामान्य रूप से कोई काम नहीं करना चाहिए और विशेष रूप से त्रुटियां नहीं बनाना चाहिए।

यदि आप IOException फेंकना चाहते हैं तो भी मुझे लगता है कि आप फ़ाइल से कुछ प्रारंभ करना चाहते हैं, इसलिए आपको शायद इस लेख को dynamic enums पर विचार करना चाहिए।

+3

यदि किसी कन्स्ट्रक्टर से अपवादों को फेंकना खराब शैली है, तो आप क्या करते हैं जब आपके कन्स्ट्रक्टर के तर्कों में से एक अमान्य है और आपकी कक्षा को काम करने से रोक देगा? मैं अपवाद फेंक कर तेजी से असफल होना पसंद करता हूं इसलिए मैं एक सार्थक स्टैक ट्रेस प्राप्त कर सकता हूं।ऐसा कहा जा रहा है कि, मैं आपसे सहमत हूं कि ओपी को ** एनम के ** कन्स्ट्रक्टर में अपवाद फेंकने की कोशिश नहीं करनी चाहिए। –

+0

@ किर्क वोल: मैं कारखाने के तरीकों का उपयोग करना पसंद करता हूं जो पैरामीटर की वैधता सुनिश्चित करते हैं। इसके अलावा मैं मुख्य रूप से चेक अपवादों पर ध्यान केंद्रित कर रहा था, RuntimeException एक सत्यापन त्रुटि आईएमओ सिग्नल करने का एक बेहतर तरीका होगा। –

+2

सभी ऑब्जेक्ट तत्कालता के लिए फैक्ट्री विधियों का विशेष उपयोग? ओह गरीब woebegotten ** नया ** ऑपरेटर। :) –

3

मेरे पास ऐसा कोई मामला है जहां मैं कुछ सेटिंग्स वर्गों में कुंजियों के रूप में enums का उपयोग करना चाहता हूं। डेटाबेस एक स्ट्रिंग मान संग्रहीत करेगा, जिससे हमें डेटाबेस को उतारने के बिना enum स्थिरांक को बदलने की अनुमति मिलती है (थोड़ा बदसूरत, मुझे पता है)। मैं एनम के कन्स्ट्रक्टर में एक रनटाइम अपवाद फेंकना चाहता था ताकि डेटाबेस को मारने से बचने के लिए स्ट्रिंग तर्क की लंबाई पुलिस और एक बाधा उल्लंघन हो रहा था जब मैं इसे आसानी से पहचान सकता था।

public enum GlobalSettingKey { 
    EXAMPLE("example"); 

    private String value; 

    private GlobalSettingKey(String value) { 
     if (value.length() > 200) { 
      throw new IllegalArgumentException("you can't do that"); 
     } 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return value; 
    } 
} 

जब मैं इस के लिए एक त्वरित परीक्षण बनाया, मैंने पाया कि अपवाद उत्पन्न मेरा नहीं था, लेकिन बजाय एक ExceptionInInitializerError था।

शायद यह गूंगा है, लेकिन मुझे लगता है कि यह स्थिर प्रारंभिक में अपवाद फेंकने के लिए एक काफी मान्य परिदृश्य है।

+2

कहता हूं लेकिन मूल अपवाद को ExceptionInInitializerError के साथ जंजीर दिया गया है, इसलिए यदि आप उस पर 'getCause()' कहते हैं, तो आपको मूल अपवाद मिलेगा। – shrini1000

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