为什么PrintStream“out”和InputStream“in”为null?

时间:2013-10-04 05:30:49

标签: java

出于好奇,我正在查看在docjar.com找到的一些Java API类的源代码。我看到了java.lang.System类,发现PrintStream“out”(即System.out)有以下代码:

public final static PrintStream out = null;

并在评论中说:

The "standard" output stream. This stream is already
open and ready to accept output data.

我的问题是,我知道最终的变量无法修改,所以为什么声明时它为null?当调用“out”方法时,为什么Java不抛出NullPointerException? System.in也是如此。

感谢您的任何澄清。

2 个答案:

答案 0 :(得分:1)

有一个java.lang.System #registerNatives()本机方法。如果你在jvm源代码中查看它,它会从本机代码中分配sysin,sysout和syserr。在java 7之前,这些声明看起来像public final static InputStream in = nullInputStream();,但我猜他们将它改为null,只是javac中的一些hack而不仅仅是内联它。

答案 1 :(得分:0)

  • 看一下private static void initializeSystemClass() - 这个 调用方法启动它,它调用setOut0()这是一个 本地方法。这将Stream绑定到它应该的位置。

    所以即使该字段可能看起来像公共静态最终它 不是,本机代码会改变它。

    JVM调用初始化它的private static void initializeSystemClass()方法。