Đây thực sự là một lỗi JDK. Nó đã được báo cáo nhiều lần trong những năm qua, nhưng chỉ trong năm 8139507, nó cuối cùng đã được Oracle thực hiện nghiêm túc.
Vấn đề là ở mã nguồn JDK cho WindowsPreferences.java
. Trong lớp này, cả hai nút userRoot
và systemRoot
được khai báo tĩnh như trong:
/**
* 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);
Điều này có nghĩa là lần đầu tiên lớp được tham chiếu cả hai biến tĩnh sẽ được bắt đầu và bằng cách này, Khóa đăng ký cho HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= cây hệ thống) sẽ được cố gắng tạo nếu nó không tồn tại.
Vì vậy, ngay cả khi người dùng thực hiện mọi biện pháp phòng ngừa trong mã riêng của mình và không bao giờ chạm vào hoặc tham chiếu cây hệ thống, thì JVM thực sự vẫn sẽ cố gắng khởi tạo systemRoot
, do đó gây ra cảnh báo. Đó là một lỗi tinh tế thú vị.
Có một bản sửa lỗi được cam kết với nguồn JDK vào tháng 6 năm 2016 và nó là một phần của Java9 trở đi. Ngoài ra còn có một backport cho Java8 trong u202.
Những gì bạn thấy thực sự là một cảnh báo từ logger nội bộ của JDK. Nó không phải là một ngoại lệ. Tôi tin rằng cảnh báo có thể được bỏ qua một cách an toàn .... trừ khi mã người dùng thực sự muốn các tùy chọn hệ thống, nhưng điều đó rất hiếm khi xảy ra.
Thông tin thưởng
Lỗi không tự tiết lộ trong các phiên bản trước Java 1.7.21, bởi vì cho đến lúc đó trình cài đặt JRE sẽ tạo khóa Registry HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
cho bạn và điều này sẽ che giấu lỗi một cách hiệu quả. Mặt khác, bạn chưa bao giờ thực sự được yêu cầu chạy trình cài đặt để có JRE trên máy của mình, hoặc ít nhất đây không phải là ý định của Sun / Oracle. Như bạn có thể biết, Oracle đã phân phối JRE cho Windows ở .tar.gz
định dạng trong nhiều năm.