2012-07-29 8 views
9

इस जावा कार्यक्रम क्यों संकलित करता है नहीं:जावा संकलन त्रुटि इस बात पर निर्भर करती है कि स्थिर चर नाम योग्य है या नहीं?

public class xx { 
    public static final Object obj; 
    static { 
//  obj = null;  // this compiles 
     xx.obj = null;  // this doesn't 
    } 
} 

इस त्रुटि के साथ:

$ javac xx.java 
xx.java:5: cannot assign a value to final variable obj 
     xx.obj = null;  // this doesn't 
     ^
1 error 
$ javac -version 
javac 1.6.0_33 

जब, अगर मैं obj = null साथ xx.obj = null (के रूप में टिप्पणी में alluded) की जगह यह संकलित करता है।

मैंने सोचा कि xx. वर्ग का नाम उपसर्ग अधिक या कम सिंटैक्स था ... क्या यह संकलक या भाषा की कल्पना में एक बग है? :)

+0

शायद एक कंपाइलर बग (जिसने पर्याप्त ध्यान आकर्षित करने के लिए अभी तक पर्याप्त लोगों को काट नहीं दिया है)। क्या कोई पुराने और नए जेडीके संस्करणों पर कोशिश कर सकता है? और ग्रहण कंपाइलर भी? – Thilo

+2

जेडीके 7 यहां एक ही त्रुटि है। –

उत्तर

7

जब आप xx.obj करते हैं, तो इसका मतलब है कि कक्षा पहले ही शुरू हो चुकी है। तो final obj फिर से शुरू नहीं किया जा सकता है। यह संकलन समय त्रुटि है। कंपाइलर ने जांच की हो सकती है कि obj अभी तक प्रारंभ नहीं किया गया है। इसे जांचना मुश्किल होगा, लेकिन सिद्धांत रूप में यह संभव है। लेकिन ऐसा नहीं है कि जावा कंपाइलर कैसे काम करता है।

+1

+1 यह मेरे उत्तर के बाद और अधिक समझ में आता है, मैंने देखा है कि आप स्थैतिक प्रारंभिक या गैर-अंतिम स्थैतिक चर के लिए स्थिर प्रारंभिक के अंदर कक्षा संदर्भ का उपयोग कर सकते हैं। –

+2

इससे मुझे कोई समझ नहीं आता है। यह कोड एक स्थिर प्रारंभकर्ता का हिस्सा है, इसलिए कोड चलने पर कक्षा प्रारंभिक प्रगति पर है; जावा को रिकर्सिव क्लास प्रारंभिक रूप से ठीक से संभालने के लिए डिज़ाइन किया गया है (अन्यथा क्या होगा)। – Archie

+0

@ आर्ची - कृपया मेरा संपादन देखें। – fastcodejava

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