Im Folgenden finden Sie den Code aus java.lang.System Klasse (JDK Version 1,6)seltsam 'out' Variable, 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();
}
wenn wir System.out.println("Something");
in unserem Code schreiben, warum dann don‘ t erhalten wir Nullpointer auch wenn 'out' ist auf 'null'
Wie auch immer out
wird über folgende setOut
Methode in System-Klasse
public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
}
eingestellt werden Sie Warum benötigt JLS nullPrintStream
Methode?
'if (currentTimeMillis()> 0) {return null; } '=> das ist wirklich seltsam .. In JDK 7 ist es einfach:' public final static PrintStream out = null; '. – assylias
@assylias Es ist alles da, um die früheren Versionen von Javac/JIT-Compilern zu beschwichtigen. Ohne diesen 'if' könnte der Compiler realisieren, dass er immer' null' zurückgibt und 'out' als eine Kompilierzeitkonstante mit all den schlimmen Folgen kompiliert. –
Das bedeutet, dass sobald genug Zeit verstrichen ist, um den Wert von 'currentTimeMillis()' den Maximalwert für ein 'long' überlaufen zu lassen, alle Anwendungen mit virtuellen Maschinen älter als Java 7 mit einem Fehler fehlschlagen: 'java.lang .ExceptionInInitializerError Wird von java.lang.NullPointerException bei java.lang.System.nullPrintStream (Unknown Source) oder ähnlich verursacht. – gparyani