源代碼如下:
package com.Sixping.Ncre;
public class Rethrow {
public static void rt() throws Exception {//定義方法,拋出Exception類的異常
System.out.println("old exception in rt()");
throw new Exception("thrown from rt()");
}
public static void wq() throws Throwable {//定義方法,調用rt(),捕獲rt()拋出的異常
try {
rt();
} catch (Exception e) {
System.out.println("Inside wq(),e.printStackTrace():");
e.printStackTrace(); //輸出堆棧使用情況
throw e; //重新拋出異常
}
}
public static void main(String[] args) throws Throwable {
try {
wq(); //產生被重新拋出的對象
} catch (Exception e) {
System.out.println("Caught in main,e.printStackTrace():");
e.printStackTrace(); //再次輸出堆棧信息
}
}
}
運行報錯如下:
old exception in rt()
java.lang.Exception: thrown from rt()
at com.Sixping.Ncre.Rethrow.rt(Rethrow.java:6)
at com.Sixping.Ncre.Rethrow.wq(Rethrow.java:10)
at com.Sixping.Ncre.Rethrow.main(Rethrow.java:19)
java.lang.Exception: thrown from rt()
at com.Sixping.Ncre.Rethrow.rt(Rethrow.java:6)
at com.Sixping.Ncre.Rethrow.wq(Rethrow.java:10)
at com.Sixping.Ncre.Rethrow.main(Rethrow.java:19)
Inside wq(),e.printStackTrace():
Caught in main,e.printStackTrace():
求大神解答
沒有錯誤啊,你不就是測試異常拋出嘛,流程是這樣的;
首先,rt()方法拋出了異常,然後你在wq()方法中捕獲並上拋出,直至main方法中捕獲的是Exception,但是wq拋出的Throwable異常沒有處理,所以被main方法繼續拋出給虛擬機了。
代碼運行是正確的,這不是運行時報錯,而是你就是測試的throw e,拋出異常後你在捕獲分支中使用的是e.printStack打印堆棧信息了。這個流程是對的,你可以注釋調用e.printStackTrace(); 就能發現不會打印堆棧日志了。