Exception 是内部是怎么执行的?

public class Test {
public static void main(String[] args) {

System.out.println(Math.ceil(999));
System.out.println(Math.ceil(5.0));
System.out.println();
new RuntimeException("exception").printStackTrace();
System.out.println();
System.out.println(Math.ceil(5.0));
System.out.println(Math.ceil(5.0));
System.out.println(Math.ceil(5.0));

}
}

这个类的运行结果中,为什么打印出来的RuntimeException的地方不一样?
感觉是随机出现的。结果如下:
999.0
5.0

5.0
5.0
5.0
java.lang.RuntimeException: exception
at com.david.cc.Test.main(Test.java:18)

java.lang.RuntimeException: exception
at com.david.cc.Test.main(Test.java:18)
999.0
5.0

5.0
5.0

5.0

999.0
5.0

java.lang.RuntimeException: exception
5.0
5.0

at com.david.cc.Test.main(Test.java:18)
5.0

Throwable.printStackTrace()方法是通过System.err打印的,所以和System.out的打印是可能会出现问题的。
如果要严格控制打印输出地话请这样使用:
[code="java"]
Throwable.printStackTrace(System.out);
[/code]