Tiếp theo là các mã từ lớp java.lang.System (JDK phiên bản 1,6)lạ 'ra khỏi' biến, 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();
}
khi chúng tôi viết System.out.println("Something");
trong mã của chúng tôi thì tại sao don' t chúng tôi nhận NullPointerException thậm chí khi 'ra' được thiết lập để 'null'
Nhưng dù sao out
sẽ được thiết lập thông qua sau setOut
phương thức trong lớp Hệ thống
public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
}
Họ n tại sao JLS cần phương pháp nullPrintStream
?
'if (currentTimeMillis()> 0) {return null; } '=> thật sự kỳ quặc .. Trong JDK 7, nó đơn giản là:' public printStream tĩnh out = null; '. – assylias
@assylias Đó là tất cả để xoa dịu các phiên bản trước của trình biên dịch javac/JIT. Nếu không có 'if' trình biên dịch có thể nhận ra nó luôn luôn trả về' null' và biên dịch 'out' như là một hằng số biên dịch, với tất cả các hậu quả xấu. –
Điều này có nghĩa là một khi đã đủ thời gian để làm cho giá trị 'currentTimeMillis()' tràn giá trị lớn nhất cho một 'long', tất cả các ứng dụng đang chạy với các máy ảo cũ hơn Java 7, sẽ thất bại với một lỗi:' java.lang .ExceptionInInitializerError Gây ra bởi java.lang.NullPointerException tại java.lang.System.nullPrintStream (Unknown Source) 'hoặc tương tự. – gparyani