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
不是编译时常量,不能内联,对吗?