当前位置: 首页 > 面试题库 >

奇怪的'out'变量System.out.println()

牟华翰
2023-03-14
问题内容

以下是来自java.lang.System类的代码(JDK版本1.6)

public final static PrintStream out = nullPrintStream(); //out is set to 'null'

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

当我们System.out.println("Something");在代码中编写代码时,为什么即使将“ out”设置为“
null”也不会得到NullPointerException

无论如何,out将通过setOutSystem类中的以下方法进行设置

public static void setOut(PrintStream out) {
     checkIO();
     setOut0(out);
 }

那么为什么JLS需要nullPrintStream方法?


问题答案:

看看private static void initializeSystemClass()-这个方法被称为启动事情,它调用的setOut0()是一个native方法。这将Stream它与应该存在的位置联系在一起。

因此,即使该字段 看起来 public static final实际上不是,native代码也会对其进行更改。

编辑

OP问 然后JLS为什么需要nullPrintStream方法

这与Java编译器有关- static final如果在编译时将字段分配给常量,它将“内联”
字段null。编译器实际上将用常量替换对字段的每个引用。

这将破坏初始化,因为对象将不再持有对Stream而是的引用null。将流分配给方法的返回可防止内联。

有人可能称其为肮脏的骇客。错误地引用Bi斯麦的话:“ JDK就像香肠一样,最好不要看到它在制造”。



 类似资料:
  • 问题内容: 当我运行以下Jenkins管道脚本时: 我收到此错误: 如果从中删除,则可以正常工作。有人可以解释导致此行为的作用域规则吗? 问题答案: TL; DR 定义的变量 与 主脚本主体不能从其他方法来访问。 定义的变量 ,而不 能够直接通过任何方法甚至从不同的脚本访问。这是一个坏习惯。 使用 和 注释定义的变量可以直接从同一脚本中定义的方法访问。 说明 当groovy编译该脚本时,它实际上将

  • 我正在使用Spring Boot2,通过阅读这里关于外部化属性的文档,我希望可以通过声明一个同名的os环境变量来覆盖application.properties中变量的值。 所以我做了如下的尝试。 首先,在中声明以下2个变量 > Spring可以看到环境变量,而不管是否有have点(.)是否在变量名中,如和所示 Spring只能在中使用同名os环境变量的值重写该变量的值,前提是该变量的名称不包含点

  • 我刚刚开始使用活动框架。我给我的Spring启动应用程序添加了依赖项,并想测试非常简单的sequnce流,但我被奇怪的行为卡住了。 所以,我有2个简单的服务,没有任何业务逻辑。 和带有进程定义的xml文件: 我放了一些控制器: 问题是:对于service1,它打印id,但是对于service2,它丢失id。在service2的调试器模式下,由于某种原因,参数id是空字符串。我不明白为什么...

  • 我得到以下错误:注意:未定义变量:POST

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么