为什么PrintStream"out"和InputStream"in"为null?

djm*_*gal 6 java

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

public final static PrintStream out = null;
Run Code Online (Sandbox Code Playgroud)

并在评论中说:

The "standard" output stream. This stream is already
open and ready to accept output data.
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的任何澄清.

Den*_*kiy 1

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