黑马程序员技术交流社区

标题: 初始代码块和打印流的一个问题 [打印本页]

作者: 紫衣侯    时间: 2013-5-31 18:53
标题: 初始代码块和打印流的一个问题
public class Text{
    public Text(){
       system.out.println("2");
       system.out.println("3");
     }
pubic static void main(String[]arg){
     new Text();
  }
static{
  system.out.println("1");
}
}
记得system.out.print()和system.err.print()的区别是前者有缓冲,而后者是直接输出。而静态初始代码块是类在加载到虚拟机时加载的,但我试了几次,竟然有时 system.err会在静态代码块前面,这是为什么呢?
作者: 顾玲玉    时间: 2013-5-31 21:50

一个打印到标准输出流,一个到错误输出流
默认两者都是屏幕的
但是你在运行的命令上可以指定输出到一个文件的。
如:java Test >out.txt 2>err.txt
那么System.out.print输出到out.txt
System.err.print()输出到err.txt

你说的那种情况是不可能出现的,肯定会先执行static块,1总是在第一,但是6不一定是最后,而且2,3,4,5的顺序不会变。原因是因为他们是不同的输出流方式。同一种输出方式,肯定是先加入的先输出。

你的代码拷下来有问题,修改后如下:
public class Test {
        public Test() {
                System.err.println("2");
                System.err.println("3");
                System.err.println("4");
                System.err.println("5");
                System.out.println("6");
        }

        public static void main(String[] arg) {
                new Test();
        }

        static {
                System.out.println("1");
        }
}



作者: 紫衣侯    时间: 2013-6-1 12:06
顾玲玉 发表于 2013-5-31 21:50
一个打印到标准输出流,一个到错误输出流
默认两者都是屏幕的
但是你在运行的命令上可以指定输出到一个文 ...

又试了试,错误输出还是能跑到静态代码块前.
作者: 郑锐    时间: 2013-6-1 16:30
大概跟System.out.print 和 System.err.print两种输出流的不同机制有关。
两种输出流的缓冲机制还有优先级都不一样,也许混合使用它们就会导致输出结果顺序的随机性吧。
解决方法就是,一直用一种输出方法,不要混用。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2