为何,java中system.out.println(),不会报空指针异常???

我查了下源文件,其中“out“是publicstaticfinalprintstreamout=null(为空);而system.out调用println()函数怎么不报... 我查了下源文件,其中“out“是public static final printstream out = null(为空);而system.out调用println()函数怎么不报空指针异常?? 展开
 我来答
libdong
推荐于2016-08-21 · 超过14用户采纳过TA的回答
知道答主
回答量:41
采纳率:100%
帮助的人:25.7万
展开全部

调用main()方法前应该设置过了。

manwu91
推荐于2016-02-04 · TA获得超过486个赞
知道小有建树答主
回答量:385
采纳率:71%
帮助的人:289万
展开全部
System.setOut(PrintStream out)是设置程序的标准输出,系统会在程序调用前调用这个方法设置成默认的输出,也就是控制台,如果想重定向到其他地方(如文件)可以通过这个方法在程序Main方法中设置,同样的还有个setErr方法。
下面是它的源码中你没看到的部分:
/**
* The following two methods exist because in, out, and err must be
* initialized to null. The compiler, however, cannot be permitted to
* inline access to them, since they are later set to more sensible values
* by initializeSystemClass().
*/
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}

private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
注意这个的注释,这段注释中提到了一个方法 initalizeSystemClass,上面说到的setOut方法就是在这个方法里被被调用的,这个方法的注释:

/**
* Initialize the system class. Called after thread initialization.
*/
明白了?
更多追问追答
追问
private static InputStream nullInputStream() throws NullPointerException {
在源文件中没看到啊?我用的jdk7.
追答
System类的源码
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
txy666793
2013-07-14 · TA获得超过625个赞
知道小有建树答主
回答量:114
采纳率:50%
帮助的人:97.5万
展开全部
system.out时,out已经被赋值了。赋值在你调用此方法前,JVM装载System类时完成的。JVM会通过OS的系统调用获取控制台句柄,将I/O设备封装为流对象,然后为System类的静态成员赋值~
追问
out 是final修饰了的,已经定??义了,out = null   不可以再改变值了吧
追答
final修饰的PrintWriter类引用out无法在Java语言层面改变值,但使用JNI进行系统调用重定向打印流对象。
/*initalizeSystemClass中调用了setIn0、setOut0和setErr0方法,猜想这是在设置System.in、System.out和System.err流对象。setOut0被声明为了一个native(本地)方法,需要用到JNI,因而看不到setOut0方法的实现。*/
private static native void setOut0(PrintStream out);
// 但有一个相似的setOut方法。
/**
* Reassigns the "standard" output stream.
* ...
* @param out the new standard output stream
* ...
*/
public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
}
//注释中指出,通过setOut方法重赋值标准输出流。可以推测,out对象是通过JNI赋的值~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
S_Kr
2013-07-14 · TA获得超过616个赞
知道小有建树答主
回答量:620
采纳率:100%
帮助的人:494万
展开全部
如果直接用null的话是一定要报空指针异常的。
out肯定是在别处做了实例化才可以用的。
你可以找一下,找到out实例化的地方。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
星空翊
2013-07-14 · TA获得超过147个赞
知道小有建树答主
回答量:121
采纳率:0%
帮助的人:66.2万
展开全部
我的源文件里显示的是:

public final static PrintStream out = nullPrintStream();

private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式