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

标签 jvm java

加载系统类时,<clinit>方法实例化 in , outerr PrintStream变量到 null使用 nullPrintStream()方法:

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

我明白为什么会这样,为什么在加载过程中不能实例化变量,但我感到困惑的是那个方法的内容。

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

最佳答案

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

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

我猜这是一个编码技巧,目的是防止编译器内联一个简单的“return null”实现。

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

关于jvm - 为什么 java/lang/System 中的 nullPrintStream() 函数将 currentTimeMillis() 与零进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8914685/

相关文章:

Java 堆栈溢出错误 - 如何在 Eclipse 中增加堆栈大小?

java - 如何在java中获取IANA格式的时区?

java - JAX-RS Jersey XML <-> java.util.List

java - 如何找到由 native 代码引起的 JVM 崩溃的根本原因

Java Spring 应用程序 - 向监听器 i 发送上下文初始化事件的异常

java - Java 标准库如何与 native 代码通信?

java - 可以从给定的 protobuf 序列化中提取所有标签号吗?

android - cordova 虚拟机初始化期间发生错误

java - 在 spring 中定义 bean 的更好方法

java - 如何初始化变量以接受任何给定的类