2009-07-15 13 views
9

ठीक है तो यह जावा पर एक नौसिखिया सवाल है, लेकिन मुझे इसके चारों ओर अपना सिर नहीं लग रहा है।क्लासलोडर स्थिर वैरिएबल कैसे लोड करता है इसका स्पष्टीकरण

मैं निम्न पंक्ति

String [] listCode = new String [LIST_INTEGER.length]; 

में एक NullPointerException की वजह से मेरी कक्षा

private static final String [] LIST_CODE = gerarListCode(); 
private static final int [][] LIST_INTEGER = new int [][] { 
     {947,947}, {110,103}, 
     {947,958}, {110,120}, 
     {947,954}, {103,107}, 
     {947,967}, {110,99,104}}; 

private static String [] gerarListCode() 
    { 
     String [] listCode = new String [LIST_INTEGER.length]; 

     for (int i=0 ; i<LIST_INTEGER.length ; i++) 
     { 
      //do some stuff  
     } 

     return listaUnicode; 
    } 

इस कोड को मुझे एक प्रारंभ अपवाद दे रहा है अंदर निम्नलिखित कोड है लगता है चर LIST_INTEGER कि कम से रिक्त है पहर।

क्या कोई समझा सकता है क्यों? क्लासलोडर प्रक्रिया रैखिक है, दूसरे शब्दों में, क्या यह सभी अन्य चर को पूरी तरह से लोड करने से पहले विधि का आह्वान करता है?

+1

कदम की घोषणा LIST_CODE – Ron

उत्तर

11

हां, संक्षेप में, यह रैखिक है।

"क्या संकलक लेकिन वास्तव में ऐसा करने के लिए आंतरिक रूप से आदेश है कि वे दिखाई देते हैं में एक भी वर्ग प्रारंभ दिनचर्या कि सभी स्थैतिक चर initializers और स्थिर प्रारंभकर्ता के सभी कोड की ब्लॉकों को जोड़ती है उत्पादन, है कक्षा घोषणा में। यह एकल प्रारंभिक प्रक्रिया स्वचालित रूप से चलती है, केवल एक बार, जब कक्षा पहली बार लोड होती है। "

संक्षेप में जावा से लिया गया।

http://www.developer.com/java/other/article.php/2238491

आप चर परिभाषित करना चाहिए और फिर सही क्रम में एक स्थिर intitializer ब्लॉक में उन्हें प्रारंभ, या इस प्रकार आप बयानों के आदेश स्वैप कर सकते हैं:

private static final int [][] LIST_INTEGER = new int [][] { {947,947}, {110,103}, 
     {947,958}, {110,120}, 
     {947,954}, {103,107}, 
     {947,967}, {110,99,104}}; 

private static final String [] LIST_CODE = gerarListCode(); 
+0

कड़ाई से बोलते हुए, यह तब नहीं होता है जब कक्षा लोड हो जाती है लेकिन बाद में, जब इसे प्रारंभ किया जाता है। –

4

जेवीएम वास्तव में स्थिर क्षेत्रों को प्रारंभ करने के क्रम में प्रारंभ करेगा।

कक्षा के पहले जेवीएम द्वारा सामना किए जाने पर कक्षा के स्थैतिक फ़ील्ड प्रारंभ किए जाते हैं। Java Puzzlers के अनुसार, पहेली 49 (जो संदर्भ जेएलएस 4.12.5 पर जाता है), स्थैतिक फ़ील्ड पहले अपने डिफ़ॉल्ट मानों पर सेट होते हैं। ऑब्जेक्ट वेरिएबल्स null पर सेट हैं, int एस 0 पर सेट हैं, आदि इसके बाद, उनके प्रारंभकर्ताओं को उपस्थिति के क्रम में निष्पादित किया जाता है।

तो, आपके उदाहरण में, LIST_CODE और LIST_INTEGER पहले null पर सेट हैं। फिर, LIST_CODE को gerarListCode() पर कॉल करके प्रारंभ किया गया है। LIST_INTEGER अभी भी null है जब उस विधि को निष्पादित किया जाता है। उसके बाद, LIST_INTEGER आपके उदाहरण में दिए गए शाब्दिक मूल्य के साथ प्रारंभ किया गया है।

+0

से पहले लाइन में LIST_INTEGER क्लास लोडर के साथ नहीं करना है। इसे जवाक द्वारा स्रोत के क्रम में स्थिर प्रारंभिक बनाने के द्वारा कार्यान्वित किया जाता है। –

+0

पकड़ने के लिए धन्यवाद, टॉम! मैंने अपना जवाब अपडेट कर लिया है। – jqno