Questo è in realtà un bug JDK. È stato segnalato più volte nel corso degli anni, ma solo nell'8139507 è stato finalmente preso sul serio da Oracle.
Il problema era nel codice sorgente JDK per WindowsPreferences.java
. In questa classe, entrambi i nodi userRoot
e systemRoot
sono stati dichiarati statici come in:
/**
* 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);
Ciò significa che la prima volta che viene fatto riferimento alla classe verranno avviate entrambe le variabili statiche e da ciò HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
verrà tentata la creazione della chiave di registro per (= albero del sistema) se non esiste già.
Quindi, anche se l'utente prendesse tutte le precauzioni nel proprio codice e non toccasse o non facesse mai riferimento all'albero del sistema, la JVM tenterebbe comunque di systemRoot
creare un'istanza , causando così l'avvertimento. È un bug sottile interessante.
È stata apportata una correzione al sorgente JDK a giugno 2016 e fa parte di Java9 in poi. C'è anche un backport per Java8 che si trova in u202.
Quello che vedi è davvero un avvertimento dal logger interno del JDK. Non fa eccezione. Credo che l'avviso possa essere tranquillamente ignorato .... a meno che il codice utente non desideri davvero le preferenze di sistema, ma è molto raro.
Informazioni sul bonus
Il bug non si era rivelato nelle versioni precedenti a Java 1.7.21, perché fino a quel momento il programma di installazione di JRE avrebbe creato la chiave di registro HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
per te e questo avrebbe effettivamente nascosto il bug. D'altra parte non ti è mai stato richiesto di eseguire un programma di installazione per avere un JRE sul tuo computer, o almeno questo non è stato l'intento di Sun / Oracle. Come forse saprai, Oracle distribuisce JRE per Windows in .tar.gz
formato da molti anni.