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

前端之家收集整理的这篇文章主要介绍了为什么java / lang / System中的nullPrintStream()函数将currentTimeMillis()比较为零?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
加载System类时,< clinit>方法使用nullPrintStream()方法实例化in,out和err PrintStream变量为null:
private static PrintStream nullPrintStream() throws NullPointerException {
    if (currentTimeMillis() > 0) {
        return null;
    }
    throw new NullPointerException();
}

我明白为什么会这样,为什么在加载过程中不能实例化变量,但是我所困惑的就是该方法内容.

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

解决方法

nullPrintStream()方法的Javadoc提供了一个线索:

The compiler,however,cannot be permitted to
inline access to them,since they are later set to more sensible values
by initializeSystemClass().

这是一个编码黑客,我猜,为了防止编译器内联一个简单的“返回null”实现.

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

原文链接:https://www.f2er.com/java/126563.html

猜你在找的Java相关文章