2012-01-18 9 views
10

Khi tải các lớp hệ thống, phương pháp <clinit> instantiates biến in, outerrPrintStream để null sử dụng nullPrintStream() phương pháp:Tại sao hàm nullPrintStream() trong java/lang/System so sánh currentTimeMillis() với 0?

private static PrintStream nullPrintStream() throws NullPointerException { 
    if (currentTimeMillis() > 0) { 
     return null; 
    } 
    throw new NullPointerException(); 
} 

Tôi hiểu tại sao đây là trường hợp, và tại sao các biến không thể được khởi tạo trong tải, nhưng những gì tôi đang nhầm lẫn là nội dung của phương pháp đó.

Tại sao nó so sánh currentTimeMillis() đến 0? Trong trường hợp nào thì so sánh đó sẽ trở lại false?

+2

Nếu bạn quay ngược thời gian đến 31/12/1969 :-) –

Trả lời

6

Các Javadoc cho phương pháp nullPrintStream() cung cấp một đầu mối:

Trình biên dịch, tuy nhiên, có thể không được phép truy cập nội tuyến cho họ, vì họ là sau thiết lập các giá trị hợp lý hơn bởi initializeSystemClass ().

Đây là lỗi mã hóa, tôi đoán, để ngăn trình biên dịch từ nội tuyến thực hiện "trả về null" đơn giản.

currentTimeMillis() sẽ không bao giờ nhỏ hơn 0. Nhưng trình biên dịch không đủ thông minh để biết điều đó, và do đó để nguyên câu lệnh có điều kiện nguyên vẹn.

+2

'để ngăn trình biên dịch từ nội tuyến đơn giản" trả về null "triển khai.' tại sao bạn muốn ngăn chặn điều đó? Nếu bất cứ điều gì nó có ý nghĩa hơn như là một kiểm tra sanity với tôi. – ArtB

+2

Thêm mã lặn cho thấy rằng một phương pháp bản địa đặt giá trị trường cho các giá trị hợp lý hơn, không null sau này. Nhưng trình biên dịch không biết rằng mã gốc sẽ can thiệp vào các trường của java.lang.System. Nó là hacky, lộn xộn, và có lẽ là một di tích. –

+0

A @ rtB, nếu trình biên dịch có một giá trị 'null' bạn không thể sử dụng' System.out' và điều đó sẽ là xấu. ;) –