0
吹塑是想在Java中4版複製一個例子Invorking fillInStackTrace方法調用後的printStackTrace方法
public class Rethrowing {
public static void f() throws Exception {
System.out.println("originating the exception in f()");
throw new Exception("thrown from f()");
}
public static void h() throws Exception {
try {
f();
} catch (Exception e) {
System.out.println("Inside h(),e.printStackTrace()");
e.printStackTrace(System.out); //first print line throw (Exception) e.fillInStackTrace();
}
}
public static void main(String[] args) {
try {
h();
} catch (Exception e) {
System.out.println("main: printStackTrace()");
e.printStackTrace(System.out);
}
}
}
Output:
originating the exception in f()
Inside h(),e.printStackTrace()
java.lang.Exception: thrown from f()
at Rethrowing.f(Rethrowing.java:20)
at Rethrowing.h(Rethrowing.java:25)
at Rethrowing.main(Rethrowing.java:35)
main: printStackTrace()
java.lang.Exception: thrown from f()
at Rethrowing.f(Rethrowing.java:20)
at Rethrowing.h(Rethrowing.java:25)
at Rethrowing.main(Rethrowing.java:35)
When comment //first print line
Output:
originating the exception in f()
Inside h(),e.printStackTrace()
main: printStackTrace()
java.lang.Exception: thrown from f()
at Rethrowing.h(Rethrowing.java:29)
at Rethrowing.main(Rethrowing.java:35)
我的問題是,爲什麼我第一次在fillInStackTrace mehod之前調用e.printStackTrace(printOut的了)方法,然後fillInStackTrace似乎不可用。任何人都可以爲我提供幫助,請提前致謝。
感謝您的評論,但我的意思是,如果我在e.fillInStackTrace()之前調用e.printStackTrace(),則原因行不是從「throw(Exception)e.fillInStackTrace()」行開始,而是從原始的「拋出新的異常(」從f()「)」行拋出。所以我不知道爲什麼會發生? – user917879
是的,因爲在h()中調用f()並引發第一個異常(「從f()」拋出)。 它被h()中的catch捕獲,並且第一個StackTrace被打印。 然後,StackTrace被重置並拋出異常。 它被main()中的catch捕獲並在那裏打印第二個StackTrace。 這裏調用「throw(Exception)e.fillInStackTrace();」堆棧被重置。但發生的異常不會改變。因此,儘管堆棧的頂點改爲Rethrowing.java:15(在SOF.Rethrowing.h(Rethrowing.java:15)),拋出的異常「從f()拋出」是原樣傳遞的。 – namalfernandolk
億萬謝謝,但我仍然不明白什麼是「StackTrace被重置」的意思,是否意味着當我打電話給e.printStackTrace()時,它已經做了重置操作「填充StakTrace」,所以它不會提供當調用e.fillInStackTrace()時。那就對了? – user917879