seguito riporta il codice dalla classe java.lang.System (JDK versione 1,6)strano 'out' variabile, System.out.println()
public final static PrintStream out = nullPrintStream(); //out is set to 'null'
private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
quando scriviamo System.out.println("Something");
nel nostro codice allora perché don' t otteniamo NullPointerException anche quando 'fuori' è impostato su 'nullo'
Comunque out
sarà impostato via seguente setOut
metodo nella classe System
public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
}
Essi n perché JLS ha bisogno del metodo nullPrintStream
?
'if (currentTimeMillis()> 0) {return null; } '=> Questo è davvero strano .. In JDK 7, è semplicemente:' public final static PrintStream out = null; '. – assylias
@assylias È tutto lì per placare le versioni precedenti dei compilatori javac/JIT. Senza che 'if' il compilatore potesse rendersi conto restituisce sempre' null' e compila 'out' come costante in fase di compilazione, con tutte le conseguenze negative. –
Ciò significa che una volta trascorso abbastanza tempo per rendere il valore di 'currentTimeMillis()' overflow del valore massimo per un 'long', tutte le applicazioni in esecuzione con macchine virtuali precedenti a Java 7, non riusciranno con un errore:' java.lang .ExceptionInInitializerError Causato da java.lang.NullPointerException su java.lang.System.nullPrintStream (sorgente sconosciuta) 'o simile. – gparyani