为什么java / lang / System中的nullPrintStream()函数将currentTimeMillis()与零进行比较?

时间:2012-01-18 17:37:59

标签: java jvm java-api

加载System类时,<clinit>方法使用{inouterr PrintStream变量将null实例化为nullPrintStream() {1}}方法:

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

我理解为什么会出现这种情况,以及为什么变量在加载过程中无法实例化,但我感到困惑的是该方法的内容。

为什么将currentTimeMillis()0进行比较?在什么情况下,该比较会返回false

1 个答案:

答案 0 :(得分:6)

nullPrintStream()方法的Javadoc给出了一个线索:

  

但是,不允许编译器        内联访问它们,因为它们后来被设置为更合理的值        通过initializeSystemClass()。

这是一个编码黑客,我想,是为了防止编译器内联一个简单的&#34;返回null&#34;实现。

currentTimeMillis()永远不会小于0.但是编译器不够聪明,知道这一点,因此保留条件语句。