2016-03-05 8 views
8

नीचे जावा में सरल उदाहरण पर विचार करें। अगर मैं new B(0) पर कॉल करके ऑब्जेक्ट बनाता हूं तो क्या होता है? सबसे पहले, मेमोरी में बनाए गए प्रकार बी का ऑब्जेक्ट। फिर, अभिव्यक्ति 1/n एक अपवाद फेंक देगा। लेकिन बनाई गई वस्तु को जावा स्पेक (§12.6.1) के अनुसार कभी भी अंतिम रूप दिया नहीं जाएगा। तो क्या हमें स्मृति रिसाव मिलती है?जावा में, कन्स्ट्रक्टर कॉल के तर्कों का मूल्यांकन करते समय क्या होता है अपवाद फेंकता है?

कृपया ध्यान दें कि मैं नहीं कह रहा हूं कि "एक कन्स्ट्रक्टर अपवाद फेंक सकता है", लेकिन "क्या होता है यदि एक निर्माता किसी विशेष स्थिति में अपवाद फेंकता है।"

एक वस्तु ओ finalizable तक इसके निर्माता ओ पर वस्तु के लिए निर्माता को निरस्त कर दिया और कहा कि मंगलाचरण सफलतापूर्वक पूरा कर लिया है (जो है, एक अपवाद फेंकने के बिना) नहीं है।

class A { 
    int n; 
    A(int n) { 
     this.n = n; 
    } 
} 

class B extends A { 
    B(int n) { 
     super(1/n); 
    } 
} 
+2

मुझे लगता है कि "अंतिम रूप देने योग्य" का मतलब है कि ऑब्जेक्ट जीसीएड होने पर 'अंतिमकरण') कहा जाता है, * नहीं * ऑब्जेक्ट जीसीड प्राप्त होगा या नहीं। –

+3

संभावित डुप्लिकेट [क्या रचनाकार जावा में अपवाद फेंक सकते हैं?] (Http://stackoverflow.com/questions/1371369/can-constructors-throw-exceptions-in-java) – mawalker

+0

@ डेविड एहरमान बिल्कुल। ऑब्जेक्ट को अंतिम रूप देने योग्य है या नहीं, यह काफी हद तक अप्रासंगिक है क्योंकि लगभग कोई परिदृश्य नहीं है जहां आपको अंतिमकर्ताओं का उपयोग करना चाहिए। – biziclop

उत्तर

4

अनुभाग आप गम्यता और finalizability में भेद के हवाले कर रहे हैं:

हर वस्तु दो विशेषताओं की विशेषता जा सकता है: यह, पहुंच योग्य finalizer-से पहुंचा जा सकता है, या पहुँच योग्य नहीं हो सकता है, और यह अपूर्ण, अंतिम, या अंतिम रूप दिया जा सकता है।

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

मामले आप का उल्लेख, Object निर्माता कभी भी नहीं चला, तो वस्तु finalizable नहीं है, लेकिन तो यह तक नहीं पहुंचा जा निर्माता OTOH, एक अपवाद फेंका गया है, ताकि एक चर के लिए new परिणाम का काम कभी नहीं होता है में ।

तो कोई स्मृति रिसाव नहीं है।

+1

आप इसे सत्यापित करने के लिए 'यह छोटा परीक्षण] (http://pastebin.com/A5tMhAxw)' -verbose: gc' के साथ चला सकते हैं। असल में "असफल" मामला बहुत तेजी से चलता है और स्मृति को तेज़ी से साफ़ करता है, जो केवल तब तक आश्चर्यजनक लगता है जब तक आप यह देखते हैं कि अंतिम रूप कार्यान्वित कैसे किया जाता है, और यह कैसे जीसी को पकड़ता है और सब कुछ धीमा कर देता है – biziclop

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

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