为何,java中system.out.println(),不会报空指针异常???
我查了下源文件,其中“out“是publicstaticfinalprintstreamout=null(为空);而system.out调用println()函数怎么不报...
我查了下源文件,其中“out“是public static final printstream out = null(为空);而system.out调用println()函数怎么不报空指针异常??
展开
5个回答
展开全部
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.
*/
明白了?
下面是它的源码中你没看到的部分:
/**
* 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类的源码
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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赋的值~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果直接用null的话是一定要报空指针异常的。
out肯定是在别处做了实例化才可以用的。
你可以找一下,找到out实例化的地方。
out肯定是在别处做了实例化才可以用的。
你可以找一下,找到out实例化的地方。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我的源文件里显示的是:
public final static PrintStream out = nullPrintStream();
private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
public final static PrintStream out = nullPrintStream();
private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询