public classThrowableTest {
Throwable
th =
new Throwable();;
public ThrowableTest() {
System.out.println("in constructor");
}
public void a()
{
c();
}
public void b()
{
System.out.println("in b");
th.fillInStackTrace();
th.printStackTrace(System.out);
System.out.println("in b");
}
public void c()
{
b();
th.fillInStackTrace();
System.out.println("in c");
th.printStackTrace(System.out);
System.out.println("in c");
}
public static void main(String[] args) {
ThrowableTest t = newThrowableTest();
t.a();
}
}
测试过程,直接执行代码
执行结果:
in
constructor
in b
java.lang.Throwable
at
com.wonew.junit.ThrowableTest.b(ThrowableTest.java:17)
at
com.wonew.junit.ThrowableTest.c(ThrowableTest.java:23)
at
com.wonew.junit.ThrowableTest.a(ThrowableTest.java:12)
at
com.wonew.junit.ThrowableTest.main(ThrowableTest.java:32)
in b
in c
java.lang.Throwable
at
com.wonew.junit.ThrowableTest.c(ThrowableTest.java:24)
at
com.wonew.junit.ThrowableTest.a(ThrowableTest.java:12)
at
com.wonew.junit.ThrowableTest.main(ThrowableTest.java:32)
in c
结论:
fillInStackTrace每次执行的时候,会清空原来的栈内的trace信息。然后在当前的调用位置处重新建立trace信息,
所以在方法b()中printStackTrace的执行结果跟c()中的是不一样的。
b()方法被c()调用,c()被a()调用,a()被main()调用,
所以在b()中fillInStackTrace时,栈内会包含b(), a(),
main()的信息;而在c()中调用fillInStackTrace时,栈内的信息会被刷新为c(), a(),
main()。
再次测试:
测试过程:将c()方法中的th.fillInStackTrace();注销掉,再次执行
再次执行结果如下:
in constructor
in b
java.lang.Throwable
at
com.wonew.junit.ThrowableTest.b(ThrowableTest.java:17)
at
com.wonew.junit.ThrowableTest.c(ThrowableTest.java:23)
at
com.wonew.junit.ThrowableTest.a(ThrowableTest.java:12)
at
com.wonew.junit.ThrowableTest.main(ThrowableTest.java:32)
in b
in c
java.lang.Throwable
at
com.wonew.junit.ThrowableTest.b(ThrowableTest.java:17)
at
com.wonew.junit.ThrowableTest.c(ThrowableTest.java:24)
at
com.wonew.junit.ThrowableTest.a(ThrowableTest.java:12)
at
com.wonew.junit.ThrowableTest.main(ThrowableTest.java:32)
in c
结论:
通过再次测试证明了上一次执行后猜测的结论是正确的。
在Junit使用fillInStackTrace大概也是为了添加失败时,清空异常栈中的trace信息,重新建立新的trace信息。
注:本文信息参照http://blog.163.com/tangyang_personal/blog/static/4622961320082244322236/