为何,java中system.out.println(),不会报空指针异常???
发布网友
发布时间:2024-04-27 03:47
我来回答
共5个回答
热心网友
时间:2024-04-27 08:40
调用main()方法前应该设置过了。
热心网友
时间:2024-04-27 08:36
我的源文件里显示的是:
public final static PrintStream out = nullPrintStream();
private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
热心网友
时间:2024-04-27 08:37
如果直接用null的话是一定要报空指针异常的。
out肯定是在别处做了实例化才可以用的。
你可以找一下,找到out实例化的地方。
热心网友
时间:2024-04-27 08:43
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.
*/
明白了?
热心网友
时间:2024-04-27 08:44
system.out时,out已经被赋值了。赋值在你调用此方法前,JVM装载System类时完成的。JVM会通过OS的系统调用获取控制台句柄,将I/O设备封装为流对象,然后为System类的静态成员赋值~