加载System类时,<clinit>
方法使用{in
,out
和err
PrintStream
变量将null
实例化为nullPrintStream()
{1}}方法:
private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
我理解为什么会出现这种情况,以及为什么变量在加载过程中无法实例化,但我感到困惑的是该方法的内容。
为什么将currentTimeMillis()
与0
进行比较?在什么情况下,该比较会返回false
?
答案 0 :(得分:6)
nullPrintStream()方法的Javadoc给出了一个线索:
但是,不允许编译器 内联访问它们,因为它们后来被设置为更合理的值 通过initializeSystemClass()。
这是一个编码黑客,我想,是为了防止编译器内联一个简单的&#34;返回null&#34;实现。
currentTimeMillis()永远不会小于0.但是编译器不够聪明,知道这一点,因此保留条件语句。