以下是從java.lang.System中類代碼(JDK 1.6版)怪 '出來' 變量,的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();
}
當我們寫在我們的代碼System.out.println("Something");
那麼爲什麼不難道我們得到NullPointerException異常甚至「出」,當設置爲「空」
總之out
將通過在系統級
public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
}
以下setOut
方法來設置他們n爲什麼JLS需要nullPrintStream
方法?
'if(currentTimeMillis()> 0){return null; }'=>這真的很奇怪..在JDK 7中,它很簡單:'public final static PrintStream out = null;'。 – assylias 2013-03-22 08:51:20
@assylias安撫早期版本的javac/JIT編譯器。如果沒有'if',編譯器就會意識到它總是返回'null'並將'out'編譯爲編譯時常量,並帶來所有不好的後果。 – 2013-03-22 08:56:56
這意味着一旦足夠的時間來使'currentTimeMillis()'的值溢出'long'的最大值,所有運行早於Java 7的虛擬機的應用程序都會失敗並出現錯誤:'java.lang 。ExceptionInInitializerError引發java.lang.System.nullPrintStream(未知源)的java.lang.NullPointerException'或類似錯誤。 – gparyani 2013-08-14 22:21:52