2013-06-15 11 views
5

नोट: मुझे अच्छी तरह से पता है कि इसे प्रारंभ करने से समस्या ठीक हो जाती है; मैंने अभी माना है कि संकलक निष्पादन पथ का पालन करेगा और देखें कि वास्तव में उस बिंदु पर foo प्रारंभ किया जाएगा जहां यह सुझाव देता है कि यह 'हो सकता है' नहीं।जावा प्रारंभिकता के साथ अप्रत्याशित व्यवहार

मेरी प्रारंभिक धारणा यह होगी कि यदि लंबाई 3 से अधिक नहीं थी, तो मुझे इसका उपयोग करने के लिए स्मृति आवंटित करने की आवश्यकता नहीं होगी।

यह उत्पादन में कभी नहीं इस्तेमाल किया जाएगा, मैं बस उत्सुक

निम्न उदाहरण देखें हूँ: -

List<String> foo; 

int length = 5; 

if (length > 3) 
{ 
    foo = new ArrayList<String>(); 
} 

if (length > 4) 
{ 
    foo.add("bar"); 
} 

ऐसा क्यों खड़ी कर रहा है प्रदर्शित करने के लिए निम्नलिखित?

स्थानीय चर foo आरंभ नहीं हो सकता है किया गया

निश्चित रूप से शाखाओं के बाद, वहाँ एक मामले जिससे foo प्रारंभ नहीं किया गया है कभी नहीं है। मुझे पता है कि अगर मैं करना चाहता था: -

List<String> foo = null; 

कोई संकलन समस्या नहीं होगी, लेकिन मुझे ऐसा करने की आवश्यकता क्यों है?

+2

@down voter, क्या आप कम से कम एक कारण प्रदान कर सकते हैं? – chrisw

उत्तर

5

स्थानीय चर को कहीं और उपयोग करने से पहले प्रारंभ करने की आवश्यकता है क्योंकि इसे डिफ़ॉल्ट रूप से प्रारंभ नहीं किया जाएगा। क्या होगा यदि if()true नहीं है?

if (length > 3) 
{ 
    foo = new ArrayList<String>(); 
} 

संकलक यह नहीं बता सकता कि स्थिति सच होगी या नहीं।

एक स्थानीय चर (§14.4, §14.13) स्पष्ट रूप से एक तरीका है कि द्वारा सत्यापित किया जा सकता में एक मूल्य दिया जाना चाहिए इससे पहले कि यह प्रयोग किया जाता है, या तो प्रारंभ (§14.4) या असाइनमेंट (§15.26), द्वारा संकलक निश्चित काम

के लिए नियमों का उपयोग कर के रूप में @jlordo बनाने बताया क्योंकि संकलन समय में ही संकलक जानता है कि length का मूल्य हमेशा 5 हो सकता है और होगा lengthfinal के रूप में, संकलन त्रुटि का समाधान हो जाएगा इसलिए स्थिति length>3 i हमेशा true तो स्थानीय चर प्रारंभ किया जाएगा।

+1

+1 यह बिंदु है - "एक तरह से जिसे संकलक द्वारा सत्यापित किया जा सकता है"। कंपाइलर सिद्धांत रूप में बता सकता है कि foo हमेशा इसका उपयोग करने से पहले असाइन किया जाता है, लेकिन नहीं। –

+0

+1 वह उद्धरण निश्चित रूप से साफ़ करता है कि आपकी स्पष्टीकरण के साथ त्रुटि क्यों होती है – chrisw

5

कंपाइलर यह सुनिश्चित नहीं कर सकता कि ब्लॉक में प्रवेश किया जाएगा या नहीं। यदि ऐसा नहीं होता है, तो foo अनियमित बने रहेंगे। आप एक अनियमित चर पर add पर कॉल नहीं कर सकते हैं। आप length फ़ाइनल बनाकर कंपाइलर की मदद कर सकते हैं। तब संकलक को पता चलेगा कि पहले if ब्लॉक को निष्पादित किया जाएगा।

final int length = 5; 
+0

@ ओस्करलोपेज़: प्रतिलिपि ओपीएस कोड, 'लंबाई' अंतिम बनाएं और संकलक त्रुटि गायब हो जाएगी;) – jlordo

+1

@ ऑस्कर, अंतिम कोड को त्रुटियों के बिना संकलित करने की अनुमति देता है; चाहे यह सही काम है या नहीं, एक और चर्चा के लिए होगा – chrisw

+0

@ chrisw69: बिल्कुल। मैं केवल यह कह रहा हूं कि यह संकलक त्रुटि को हटा देगा। मैं यह नहीं कह रहा हूं कि यह अच्छी शैली है। – jlordo

1

ऐसा इसलिए होता है क्योंकि फू को शाखा में प्रारंभ किया जाता है। इसलिए संकलक निश्चित नहीं है कि foo प्रारंभ किया जाएगा या नहीं।

2

क्योंकि क्लास या ऑब्जेक्ट इंस्टेंस के विपरीत, स्थानीय उदाहरण डिफ़ॉल्ट रूप से प्रारंभ नहीं होता है।

Java Language Specification से:

एक स्थानीय चर (§14.4, §14.14) स्पष्ट रूप से एक मान दिया जाना चाहिए इससे पहले कि यह प्रयोग किया जाता है, या तो प्रारंभ (§14.4) या असाइनमेंट (§15.26) द्वारा एक तरह से जिसे निश्चित असाइनमेंट (§16) के नियमों का उपयोग करके कंपाइलर द्वारा सत्यापित किया जा सकता है।

मूलभूत मूल्यों:

For type byte, the default value is zero, that is, the value of (byte)0. 
For type short, the default value is zero, that is, the value of (short)0. 
For type int, the default value is zero, that is, 0. 
For type long, the default value is zero, that is, 0L. 
For type float, the default value is positive zero, that is, 0.0f. 
For type double, the default value is positive zero, that is, 0.0d. 
For type char, the default value is the null character, that is, '\u0000'. 
For type boolean, the default value is false. 
For all reference types (§4.3), the default value is null. 
1

उदाहरण और वर्ग चर शून्य या 0 मूल्यों के लिए शुरू कर रहे हैं। लेकिन स्थानीय चर नहीं हैं। तो आपको इसका उपयोग करने से पहले स्थानीय चर प्रारंभ करना होगा।

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