2011-11-29 66 views
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似乎不可用。任何人都可以爲我提供幫助,請提前致謝。

回答

0

user917879,當您致電e.fillInStackTrace();它重置StackTrace。因此,要打印當前的StackTrace - 在它被重置之前 - 您需要先調用e.printStackTrace(printOut out)。

+0

感謝您的評論,但我的意思是,如果我在e.fillInStackTrace()之前調用e.printStackTrace(),則原因行不是從「throw(Exception)e.fillInStackTrace()」行開始,而是從原始的「拋出新的異常(」從f()「)」行拋出。所以我不知道爲什麼會發生? – user917879

+0

是的,因爲在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

+0

億萬謝謝,但我仍然不明白什麼是「StackTrace被重置」的意思,是否意味着當我打電話給e.printStackTrace()時,它已經做了重置操作「填充StakTrace」,所以它不會提供當調用e.fillInStackTrace()時。那就對了? – user917879