2017-06-19 17 views
49

का उपयोग कर की चेतावनी है जब Integer.parseInt(String s, int radix) (8 जावा, 1.8.0_131) के लिए स्रोत कोड देख, मैं निम्नलिखित टिप्पणी ब्लॉक मिला:क्यों parseInt valueOf

/* 
* WARNING: This method may be invoked early during VM initialization 
* before IntegerCache is initialized. Care must be taken to not use 
* the valueOf method. 
*/ 

मैं IntegerCache के बारे में पहले भाग समझते हैं , मुझे समझ में नहीं आता कि valueOf के बारे में चेतावनी क्यों है, और इस संदर्भ में क्यों।

मुझे लगता है कि valueOf()parseInt() पर निर्भर करता है, लेकिन मुझे अभी भी यह चेतावनी नहीं है कि यह चेतावनी क्यों है।

क्या कोई यह बता सकता है कि वास्तव में टिप्पणी मुझे किस बारे में चेतावनी देती है (और संदर्भ जहां valueOf का उपयोग नहीं किया जाना चाहिए), और संभवतः गलत क्या हो सकता है।

संपादित करें:

Integer.valueOf में कोड, (int i) नीचे टिप्पणी से अन्य सवाल के बाद से बदल गया है के लिए कहा गया लगता है यह अब

public static Integer valueOf(int i) { 
    if (i >= IntegerCache.low && i <= IntegerCache.high) 
     return IntegerCache.cache[i + (-IntegerCache.low)]; 
    return new Integer(i); 
} 

और से बचाने की जानी चाहिए पहले दावा त्रुटि।

+1

संभावित डुप्लिकेट [इंटीजर क्लास की Integer.valueOf विधि में क्यों जोर दिया जाता है?] (Https://stackoverflow.com/questions/33891156/why-is-assert-used-in-the-integer- मूल्य-विधि-का-पूर्णांक-वर्ग) – Blasanka

+1

जोर 8 जावा इंटीजर में प्रतीत नहीं होता है।valueOf() @blasanka, क्या आप डुप्लिकेट वोट की व्याख्या कर सकते हैं, या मुझे उस कोड पर इंगित करें जो अभी भी डुप्लिकेट लक्ष्य से जुड़े कोड के बराबर है? – Michael

उत्तर

53

क्या कोई यह बता सकता है कि वास्तव में टिप्पणी मुझे किस बारे में चेतावनी देती है (और संदर्भ जहां valueOf का उपयोग नहीं किया जाना चाहिए), और संभवतः गलत क्या हो सकता है।

Integer वर्ग बनाता है और Integer वस्तुओं छोटे पूर्णांक मूल्यों का प्रतिनिधित्व करने की एक कैश रखता है; डिफ़ॉल्ट रूप से, श्रेणी -128 से 127 तक के मान शामिल हैं (अधिक चर्चा here, here, और कई अन्य स्थानों)। Integer.valueOf() इस कैश से ऑब्जेक्ट वापस कर देगा जब इसकी तर्क सीमा में किसी संख्या का प्रतिनिधित्व करती है। टिप्पणी चेतावनी दे रही है कि parseInt()valueOf() पर भरोसा नहीं करना चाहिए क्योंकि उस कैश को पॉप्युलेट करने से पहले पूर्व को बुलाया जा सकता है।

दुर्व्यवहार कि उस मामले में उम्मीद की जा सकती निर्दिष्ट किया जाता है नहीं, और क़यास जावा संस्करणों के बीच अलग-अलग हो सकता है, लेकिन प्रशंसनीय संभावनाओं कि null या लौटा दिया जाएगा एक अपवाद (NullPointerException, IndexOutOfBoundsException, ...) फेंक दिया जाएगा।

किसी भी मामले में, यह कार्यान्वयन में एक आंतरिक टिप्पणी है, कक्षा Integer के उपयोगकर्ताओं को कोई टिप्पणी नहीं। जब भी कोई उपयोगकर्ता कोड चलता है, आवश्यक कैश प्रारंभिक पूर्ण हो जाता है, और Integer.valueOf() को its API documentation वर्णनों के अनुसार पूरी तरह व्यवहार करने के लिए भरोसा किया जा सकता है।

36

स्रोत कोड (लगभग) संदर्भ के लिए है, जावाडोक में उस चेतावनी नहीं है क्योंकि यह केवल जावा के डेवलपर्स के लिए है।

यह शायद एक चेतावनी है क्योंकि valueOf विधि का उपयोग करने वाले किसी समस्या या बग को parseInt विधि कोड करने के लिए किया गया है जिसे आंतरिक कैश प्रारंभ करने से पहले कहा जा सकता है।

दूसरे शब्दों में, यह चेतावनी आपके लिए नहीं है, मान लीजिए कि आप इंटीजर क्लास को नहीं बदल रहे हैं!

+1

धन्यवाद, बीटीडब्ल्यू अच्छा सवाल - उस चेतावनी से अवगत नहीं था –

+0

जब मैं इसे पढ़ता हूं तो मैं काफी उलझन में था ...: डी – Michael

+0

यदि आप इंटीजर को उप-वर्गीकृत कर रहे हैं, तो यह निश्चित रूप से आपको कुछ जानने की आवश्यकता है। –

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