Java執行出錯丟出例外時,常會列印一串 Caused by 訊息,其格式為 java.lang.Exception: Exception in xxx at ......... (....java: ..) ....... at ......... (....java: ..) Caused by: java.lang.Exception: Exception in yyy at ......... (....java: ..) ....... at ......... (....java: ..) Caused by: java.lang.Exception: Exception in zzz at ......... (....java: ..) ....... at ......... (....java: ..)
這表示先有 zzz 錯誤,然後造成 yyy 錯誤,然後造成 xxx 錯誤。因此,最初錯誤原因為最後Caused by 指出的 zzz 錯誤。至於每個錯誤後面都會跟著很多 at,印出丟出例外當時的方法堆疊內容,越後面的 at 程式碼越早執行。
public class CausedByExample {
public static void main(String[] args) {
try {
method1(); // line 4
} catch (Exception e) {
// 此行指令表明 執行方法main出現例外 將列印丟出例外時的堆疊記錄內容
e.printStackTrace();
}
}
public static void method1() throws Exception {
try {
method2(); // line 13
} catch (Exception e) {
// 此行指令表明 執行方法1出現例外 是由 執行方法2的例外e 所造成,將列印
// java.lang.Exception: Exception in method1
// 逐層列印丟出方法1例外時的堆疊記錄內容
throw new Exception("Exception in method1", e); // line 18
// public Exception(String message, Throwable cause)
// 產生新例外,包含例外說明字串 message,及造成本例外的原因 cause
}
}
public static void method2() throws Exception {
// 此行指令表明 執行方法2出現例外,將列印
// java.lang.Exception: Exception in method2
// 逐層列印丟出方法2例外時的堆疊記錄內容
throw new Exception("Exception in method2"); // line 26
}
}
Output:
上面程式在method2產生例外,由method1接收,再包裝成原因產生新例外,由main接收,列印e.printStackTrace。其列印內容說明,Exception in method2 造成 Exception in method1。
java.lang.Exception: Exception in method1
at CausedByExample.method1(CausedByExample.java:18)
at CausedByExample.main(CausedByExample.java:4)
Caused by: java.lang.Exception: Exception in method2
at CausedByExample.method2(CausedByExample.java:26)
at CausedByExample.method1(CausedByExample.java:13)
... 1 more