比如我有个程序:
try{
//省略
}catch(Exception e){
System.err.println("出错了!");
e.printStackTrace();
} System.out.println("异常演示");运行结果是:打印的堆栈信息位置不固定,就是main方法里输出的“异常演示”这几个字有时在堆栈信息上边,有时插在好多堆栈信息的中间,请问为什么不是把堆栈信息都打印完了再输出“异常演示”这几个字呢?不是顺序执行的吗?
try{
//省略
}catch(Exception e){
System.err.println("出错了!");
e.printStackTrace();
} System.out.println("异常演示");运行结果是:打印的堆栈信息位置不固定,就是main方法里输出的“异常演示”这几个字有时在堆栈信息上边,有时插在好多堆栈信息的中间,请问为什么不是把堆栈信息都打印完了再输出“异常演示”这几个字呢?不是顺序执行的吗?
printStackTrace(System.err);
}public void printStackTrace(PrintStream s) {
synchronized (s) {
s.println(this);
StackTraceElement[] trace = getOurStackTrace();
for (int i=0; i < trace.length; i++)
s.println("\tat " + trace[i]); Throwable ourCause = getCause();
if (ourCause != null)
ourCause.printStackTraceAsCause(s, trace);
}
}由上面代码可以看出printStackTrace使用的是System.err引用的PrintStream。同样他同步的也是这个输出流。
明白了,就是说这个printStackTrace用了多线程机制,并发的在执行吧。又因为锁的对象是system.err,所以在执行 System.err.println("出错了!");这句话的时候肯定先打印“出错了”,后打印堆栈信息,是这样吧?