2009-09-03 18 views

उत्तर

324

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

एक बात निर्माता में अपवाद फेंकने के बारे में सावधान रहने की: क्योंकि फोन करने वाले (आमतौर पर) नई वस्तु का उपयोग करने का कोई रास्ता नहीं होगा, निर्माता (फ़ाइल हैंडल आदि) अप्रबंधित संसाधन प्राप्त करने से बचने के लिए सावधान रहना चाहिए और फिर उन्हें जारी किए बिना अपवाद फेंकना। उदाहरण के लिए, यदि निर्माता FileInputStream और FileOutputStream खोलने का प्रयास करता है, और पहला सफल होता है लेकिन दूसरा विफल रहता है, तो आपको पहली स्ट्रीम को बंद करने का प्रयास करना चाहिए। यह कठिन हो जाता है अगर यह उप-वर्ग निर्माता है जो अपवाद फेंकता है, बेशक ... यह सब थोड़ा मुश्किल हो जाता है। यह अक्सर एक समस्या नहीं है, लेकिन यह विचार करने लायक है।

+25

+1। कोई भी आमतौर पर subclasses द्वारा फेंक अपवादों के बारे में सोचता है। –

+1

@ जोनस्केट: ** क्या आप कृपया ** ** के बारे में कुछ कोड उदाहरण दे सकते हैं यदि यह पहले कन्स्ट्रक्टर में दिखाई देता है (उदा। स्थिर क्षेत्र निर्दिष्ट करके, या संग्रह में स्वयं जोड़कर)। *? – Tarik

+3

@ तारिक: ठीक है कोड उदाहरण बिल्कुल ऐसा करेगा - उदा। 'कुछ स्टेटिकफिल्ड = यह;' या 'कुछ कोलेक्शन.एड (यह)' एक कन्स्ट्रक्टर के भीतर। –

31

बिल्कुल।

निर्माता वैध इनपुट प्राप्त नहीं होता है, या एक वैध तरीके से वस्तु का निर्माण नहीं कर सकते, यह कोई विकल्प नहीं एक अपवाद फेंक और उसके फोन करने वाले सचेत करने के लिए है।

7

हां।

कंस्ट्रक्टर्स विशेष तरीकों से ज्यादा कुछ नहीं कर रहे हैं, और किसी भी अन्य विधि की तरह अपवाद फेंक कर सकते हैं।

+0

करता है आपके बयान में महत्वपूर्ण बात "विशेष तरीकों" है। तो वे किसी अन्य विधि की तरह नहीं हैं। एक गैर-अंतिम श्रेणी 'कन्स्ट्रक्टर ** से अपवाद फेंकना ** ** एक सुरक्षा छेद बना सकता है, इसलिए ऐसा करने का निर्णय लेने पर विशेष देखभाल की जानी चाहिए। जावा सिक्योर कोडिंग दिशानिर्देशों से निकालने के साथ उपरोक्त @ बिली द्वारा उत्तर देखें। –

11

हाँ, कंस्ट्रक्टर्स अपवाद फेंक दिया जाता है।

हालांकि, चुनने क्या अपवाद उन्हें होना चाहिए में बहुत बुद्धिमान हो - अपवादों या अनियंत्रित जाँच की। अनचेक अपवाद मूल रूप से RuntimeException के उप-वर्ग हैं।

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

लाभ यह है कि एक जाँच अपवाद प्रदान करता है पता चलता है कि वस्तु उदाहरण बनाने के लिए एक विफलता नहीं हो सकता है कि उस प्रोग्रामर उसकी इन्स्टेन्शियशन कोड में अपवाद को पकड़ने के लिए मजबूर किया जाता है है, और इस तरह। बेशक, केवल एक कोड समीक्षा अपवाद को निगलने के खराब प्रोग्रामिंग अभ्यास को पकड़ लेगी।

76

हां, वे अपवाद फेंक सकते हैं। यदि ऐसा है, तो वे केवल आंशिक रूप से प्रारंभ किए जाएंगे और यदि गैर-अंतिम, हमले के अधीन।

निम्नलिखित Secure Coding Guidelines 2.0 से है।

अंतिम रूप से गैर-अंतिम वर्ग के प्रारंभिक उदाहरणों को अंतिम रूप से हमले के माध्यम से पहुंचा जा सकता है। हमलावर एक सबक्लास में संरक्षित अंतिम विधि को ओवरराइड करता है, और उस सबक्लास का एक नया उदाहरण बनाने का प्रयास करता है। यह प्रयास विफल रहता है (उपरोक्त उदाहरण में, classloader के निर्माता में SecurityManager जांच एक सुरक्षा अपवाद फेंकता है), लेकिन हमलावर बस किसी भी अपवाद ध्यान नहीं देता और इंतजार कर रहा है आभासी मशीन आंशिक रूप से प्रारंभ वस्तु पर अंतिम रूप देने के लिए प्रदर्शन करने के लिए। जब ऐसा होता है तो दुर्भावनापूर्ण अंतिम रूप विधि कार्यान्वयन किया जाता है, हमलावर को इसका उपयोग करने के लिए, ऑब्जेक्ट को अंतिम रूप देने का संदर्भ दिया जाता है। यद्यपि ऑब्जेक्ट केवल आंशिक रूप से प्रारंभ किया गया है, हमलावर अभी भी इस पर विधियों का आह्वान कर सकता है (जिससे सुरक्षा प्रबंधक जांच को रोकता है)।

+1

क्या इसका मतलब गैर-अंतिम वर्ग से फेंकना सुरक्षा उल्लंघन है? क्या यह अभी भी एक मुद्दा है? – kroiz

+1

ध्यान दें कि यह दिशानिर्देश केवल तभी प्रासंगिक है जब आपका कोड है, या उस संदर्भ में उपयोग होने की संभावना है जहां सुरक्षा महत्वपूर्ण है। उदाहरण के लिए, अधिकांश जावा कोड उन संदर्भों में उपयोग किया जाता है जहां कोई सुरक्षा प्रबंधक नहीं है। –

0

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

+8

एक उपवर्ग निर्माता एक अपवाद पकड़ कर सकते हैं नहीं, सुपर (से पहले एक कोशिश ब्लॉक का उपयोग के बाद से) एक संकलन त्रुटि का कारण होगा ("सुपर करने के लिए कॉल निर्माता में पहले बयान होना चाहिए") –

10

हाँ, यह एक अपवाद फेंक कर सकते हैं और तुम भी रूप में नीचे दिखाए गए उदाहरण घोषणा कर सकते हैं कि निर्माता के हस्ताक्षर में:

public class ConstructorTest 
{ 
    public ConstructorTest() throws InterruptedException 
    { 
     System.out.println("Preparing object...."); 
     Thread.sleep(1000); 
     System.out.println("Object ready"); 
    } 

    public static void main(String ... args) 
    { 
     try 
     { 
      ConstructorTest test = new ConstructorTest(); 
     } 
     catch (InterruptedException e) 
     { 
      System.out.println("Got interrupted..."); 
     } 
    } 
} 
-1

हाँ यह फेंक कर सकते हैं अन्य विधि की तरह एक अपवाद

+1

आप, इस विस्तृत जवाब के लिए बहुत बहुत धन्यवाद, हालांकि इस सवाल पहले से ही बहुत बेहतर पदों का उत्तर दिया गया है। – Tom

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