zoukankan      html  css  js  c++  java
  • 为什么java中system.out.println(),不会报空指针异常...

    源文件中,其中“out“是public static final printstream out = null”

    貌似我们学过变量一旦被final修饰,其值不可改变

    源码的解释:

    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赋的值~

     

     

     源码部分:

    /**
    * 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.
    */

    System.out这个值其实可以由System.setOut()这个方法来设定的,它其实是个native的方法。
    Java代码前面加了final只是让用户无法赋值而已。

     
     
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    神奇的HTML5画图应用
    Eclipse REST 库使用
    在应用中使用Ext Loader
    新浪微博XSS攻击事件
    数字图像处理空间变换
    安装制作不用愁—Wise installation入门教程
    ExtJS 4中自定义Grid列标题的对齐方式
    页面的兼容性从认识<!DOCTYPE>开始
    ExtJS 4.1有什么值得期待?
    ExtJS应用架构设计(二)
  • 原文地址:https://www.cnblogs.com/name-lizonglin/p/14614236.html
Copyright © 2011-2022 走看看