यह वास्तव में JDK बग है। यह वर्षों में कई बार रिपोर्ट किया गया है, लेकिन केवल 8139507 में यह अंततः ओरेकल द्वारा गंभीरता से लिया गया था।
समस्या JDK स्रोत कोड के लिए थी WindowsPreferences.java
। इस श्रेणी में, दोनों नोड्स userRoot
और systemRoot
स्थिर रूप में घोषित किए गए थे:
/**
* User root node.
*/
static final Preferences userRoot =
new WindowsPreferences(USER_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
/**
* System root node.
*/
static final Preferences systemRoot =
new WindowsPreferences(SYSTEM_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
इसका मतलब यह है कि पहली बार जब क्लास को संदर्भित किया जाता है तो दोनों स्टैटिक वैरिएबल को शुरू किया जाएगा और इसके द्वारा रजिस्ट्री कुंजी HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= सिस्टम ट्री) बनाने की कोशिश की जाएगी यदि यह पहले से मौजूद नहीं है।
इसलिए, भले ही उपयोगकर्ता ने प्रत्येक एहतियात को अपने कोड में लिया हो और सिस्टम ट्री को कभी भी छुआ या संदर्भित नहीं किया हो, तो जेवीएम वास्तव में अभी भी तुरंत प्रयास करेगा systemRoot
, इस प्रकार चेतावनी का कारण बनता है। यह एक दिलचस्प सूक्ष्म बग है।
जून 2016 में JDK स्रोत के लिए प्रतिबद्ध एक फिक्स है और यह Java9 का हिस्सा है। Java8 के लिए एक बैकपोर्ट भी है जो u202 में है।
आप जो देख रहे हैं वह वास्तव में जेडीके के आंतरिक लकड़हारे की चेतावनी है। यह अपवाद नहीं है। मेरा मानना है कि चेतावनी को सुरक्षित रूप से अनदेखा किया जा सकता है .... जब तक कि उपयोगकर्ता कोड वास्तव में सिस्टम वरीयताओं को नहीं चाहता है, लेकिन ऐसा बहुत कम ही होता है।
बोनस की जानकारी
जावा 1.7.21 से पहले बग ने संस्करणों में खुद को प्रकट नहीं किया, क्योंकि तब तक JRE इंस्टॉलर आपके लिए रजिस्ट्री कुंजी बना देगा HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
और यह बग को प्रभावी ढंग से छिपाएगा। दूसरी तरफ आपको अपनी मशीन पर JRE लगाने के लिए कभी भी एक इंस्टॉलर को चलाने की आवश्यकता नहीं होती है, या कम से कम यह Sun / Oracle का इरादा नहीं रहा है। जैसा कि आप जानते हैं कि ओरेकल .tar.gz
कई वर्षों से प्रारूप में विंडोज के लिए जेआरई वितरित कर रहा है ।