Poniżej znajduje się kod z klasy java.lang.System (JDK wersja 1,6)dziwne 'out' zmienna, 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();
}
gdy piszemy System.out.println("Something");
w naszym kodzie dlaczego don” t otrzymujemy NullPointerException nawet gdy „out” jest ustawiony na „null”
Byle out
zostanie ustalona poprzez następujące metody w klasie setOut
systemu
public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
}
one n dlaczego JLS potrzebuje metody nullPrintStream
?
'if (currentTimeMillis()> 0) {return null; } '=> To naprawdę dziwne. W JDK 7 jest to po prostu:' public final static PrintStream out = null; '. – assylias
@assylias Wszystko po to, aby poskromić wcześniejsze wersje kompilatorów javac/JIT. Bez tego "jeśli" kompilator mógłby zrozumieć, że zawsze zwraca 'null' i kompiluje' out' jako stałą czasu kompilacji, z wszystkimi złymi konsekwencjami. –
Oznacza to, że gdy minie wystarczająco dużo czasu, aby wartość 'currentTimeMillis()' przekroczyła maksymalną wartość dla 'long', wszystkie aplikacje działające z maszynami wirtualnymi starszymi niż Java 7, zawiedzie z błędem:' java.lang .ExceptionInInitializerError Powodowane przez java.lang.NullPointerException na java.lang.System.nullPrintStream (Unknown Source) 'lub podobne. – gparyani