นี่เป็นข้อบกพร่องของ JDK มีการรายงานหลายครั้งในช่วงหลายปีที่ผ่านมา แต่มีเพียง8139507เท่านั้นที่ทำให้ออราเคิลดำเนินการอย่างจริงจัง
WindowsPreferences.java
ปัญหาก็คือในซอร์สโค้ดสำหรับ JDK ในคลาสนี้ทั้งสองโหนด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
(= โครงสร้างระบบ) จะพยายามที่จะสร้างขึ้นหากยังไม่มีอยู่
ดังนั้นแม้ว่าผู้ใช้จะใช้ความระมัดระวังทุกครั้งในรหัสของตัวเองและไม่เคยแตะต้องหรืออ้างอิงโครงสร้างของระบบดังนั้น JVM ก็ยังคงพยายามที่จะสร้างอินสแตนซ์systemRoot
ซึ่งทำให้เกิดการเตือน มันเป็นข้อผิดพลาดที่ลึกซึ้งที่น่าสนใจ
มีการแก้ไขที่มุ่งมั่นกับแหล่ง JDK ในเดือนมิถุนายน 2559 และเป็นส่วนหนึ่งของ Java9 เป็นต้นไป นอกจากนี้ยังมีbackportสำหรับ Java8 ซึ่งอยู่ใน u202
สิ่งที่คุณเห็นคือคำเตือนจากตัวบันทึกภายในของ JDK มันไม่ได้เป็นข้อยกเว้น ฉันเชื่อว่าคำเตือนสามารถเพิกเฉยได้อย่างปลอดภัย .... เว้นแต่ว่ารหัสผู้ใช้นั้นต้องการการตั้งค่าระบบ แต่ก็ไม่ค่อยเกิดขึ้น
ข้อมูลโบนัส
ข้อผิดพลาดไม่ได้เปิดเผยตัวเองในรุ่นก่อนหน้า Java 1.7.21 เนื่องจากจนถึงตัวติดตั้ง JRE จะสร้างคีย์รีจิสทรีHKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
ให้คุณและสิ่งนี้จะซ่อนข้อบกพร่องได้อย่างมีประสิทธิภาพ ในทางกลับกันคุณไม่จำเป็นต้องเรียกใช้ตัวติดตั้งเพื่อให้มี JRE ในเครื่องของคุณหรืออย่างน้อยก็ไม่ได้มีเจตนาของ Sun / Oracle ดังที่คุณอาจทราบว่า Oracle ได้แจกจ่าย JRE สำหรับ Windows ใน.tar.gz
รูปแบบเป็นเวลาหลายปี