2013-05-07 8 views
6

मैंने स्थिर प्रारंभिक में कुछ देखा जो जावैक में एक बग हो सकता है। मैंने एक परिदृश्य बनाया है जहां मैं चर को एक वैल्यू असाइन कर सकता हूं लेकिन उस मान को वापस नहीं पढ़ सकता।घोषणा प्रारंभ करने से पहले रखा गया स्टेटिक प्रारंभकर्ता त्रुटि

दो उदाहरण नीचे दिए गए हैं, पहले ठीक संकलित होते हैं, दूसरा टीएमपी से मूल्य पढ़ने की कोशिश करते समय त्रुटि प्राप्त करता है, लेकिन किसी कारण से टीएमपी के लिए मूल्य आवंटित करने की अनुमति है। मैं समझ सकता हूं कि क्या यह न तो पढ़ सकता है और न ही चर को लिख सकता है क्योंकि स्थिर प्रारंभकर्ता के बाद टीएमपी घोषित किया जाता है, लेकिन उनमें से केवल एक त्रुटि मुझे समझ में नहीं आती है।

//Compiles Successfully: 
public class Script 
{ 
    public static Object tmp; 
    static 
    { 
     tmp = new Object(); 
     System.out.println(tmp); 
    } 

} 

//error only on the read but not the assignment 
public class Script 
{ 

    static 
    { 
     tmp = new Object(); 
     System.out.println(tmp); 
    } 
    public static Object tmp; 
} 

बिंदु को आगे बढ़ाने के लिए, यह सफलतापूर्वक संकलित करता है।

public class Script 
{ 

    static 
    { 
     tmp = new Object(); 
    } 
    public static Object tmp; 
} 
+0

मेरा मानना ​​है [एक समान प्रश्न का उत्तर] [1] इस सवाल का जवाब मैं जितना कर सकता हूं उससे बेहतर है। यह अजीब व्यवहार है लेकिन एक बग नहीं है। यह वह कर रहा है जो इसे करना है। [1]: http://stackoverflow.com/a/10035928/348975 – emory

+0

मुझे यकीन नहीं है कि यह करता है, वैरिएबल प्रारंभकर्ता वेरिएबल को उनके डिफ़ॉल्ट मान से प्रारंभ करने के लिए होते हैं। जो स्थिर int v = 1 कहना है; स्थिर int v के बराबर है; स्थिर {v = 1;} –

+0

@ ड्यूकलिंग मैंने अपनी टिप्पणी को एक उत्तर के रूप में लिखा और स्टैक ओवरव्लो ने निर्धारित किया कि मेरा जवाब छोटा था (मुझे लगता है कि इसका मतलब बहुत छोटा है) और स्वचालित रूप से इसे एक टिप्पणी में परिवर्तित कर दिया, लेकिन स्पष्ट रूप से लिंक को फ़्लब किया। – emory

उत्तर

3

ऐसा लगता है इस कल्पना में परिभाषित किया गया है (JLS 8.3.2.3 देखें):

एक सदस्य की घोषणा से पहले ही ही प्रयोग किया जाता है किसी तरह से टेक्स्ट प्रकट करने के लिए करता है, तो सदस्य एक उदाहरण (क्रमशः स्थिर है की जरूरत है) क्लास अथवा अंतरफलक सी और निम्नलिखित शर्तें पूरी के क्षेत्र पकड़:

  • उपयोग एक उदाहरण (क्रमशः स्थिर में होता है) vari सी के एक प्रारंभिक प्रारंभकर्ता (क्रमशः स्थिर) प्रारंभिक
    सी

  • उपयोग असाइनमेंट के बाईं ओर नहीं है।

  • उपयोग एक साधारण नाम के माध्यम से है।

  • सी अंतर्निहित कक्षा या इंटरफ़ेस उपयोग को संलग्न करता है।

तो अगर उपयोग एक काम के बाएं हाथ की ओर है, तो यह कानूनी है, के बाद से एक दूसरे के अब और नहीं रखता है।

+0

ठीक है, मैं खरीदता हूं कि यह विनिर्देश का हिस्सा है, फिर भी –

+0

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

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