Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jvm 为什么java/lang/System中的nullPrintStream()函数会将currentTimeMillis()与零进行比较?_Jvm_Java - Fatal编程技术网

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

Jvm 为什么java/lang/System中的nullPrintStream()函数会将currentTimeMillis()与零进行比较?,jvm,java,Jvm,Java,加载系统类时,方法使用nullPrintStream()方法将in、out和errPrintStream变量实例化为null: private static PrintStream nullPrintStream() throws NullPointerException { if (currentTimeMillis() > 0) { return null; } throw new NullPointerException(); } 我理解为什

加载系统类时,
方法使用
nullPrintStream()
方法将
in
out
err
PrintStream
变量实例化为
null

private static PrintStream nullPrintStream() throws NullPointerException {
    if (currentTimeMillis() > 0) {
        return null;
    }
    throw new NullPointerException();
}
我理解为什么会出现这种情况,为什么在加载过程中不能实例化变量,但我对该方法的内容感到困惑


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

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

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

我想,这是一种编码技巧,可以防止编译器内联一个简单的“returnnull”实现


currentTimeMillis()永远不会小于0。但是编译器没有足够的聪明来知道这一点,因此保留了条件语句完好无损。

如果您回到1969年12月31日:-)
来防止编译器内联一个简单的“return null”实现。
为什么要阻止它?如果有什么区别的话,我认为这是一个合理的检查。更多的代码分析表明,本机方法稍后会将字段值设置为更合理的非空值。但是编译器不知道本机代码会干扰java.lang.System的字段。这是一个杂乱无章的地方,很可能是一个遗迹。A@rtB,如果编译器内联了一个
null
值,则无法使用
System.out
,这将是不好的嗯,我想这是有道理的。内联
null
值到底意味着什么?假设引用始终为
null
@SteveMcLeod,我知道这些值是本机设置的,但这是必要的,这样它们就可以成为
公共静态final
,并且在加载后仍然可以实例化。
null
不是编译时常量,不能内联,对吗?