1. 簡介
Stack Trace(堆疊追蹤)— 是在你的程式發生錯誤(例外)之前,被呼叫過的方法清單。當程式出現例外時,Java 會自動把堆疊追蹤輸出到畫面上。這就像「雪地上的足跡」:你可以看到程式是沿著哪些步驟一路走到錯誤發生的。
類比:
想像你走進迷宮,結果撞上了牆。Stack trace 就是一張地圖,顯示你在迷宮裡走過哪些走道,才會迷路。
Stack Trace 長什麼樣子?
當程式發生錯誤時,Java 會輸出類似下面的訊息:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.divide(Main.java:10)
at Main.main(Main.java:5)
這是什麼意思?
- Exception in thread "main" — 表示在哪個執行緒中發生錯誤(通常是 "main")。
- java.lang.ArithmeticException: / by zero — 例外類型與其訊息。
- at Main.divide(Main.java:10) — Main 類別中的 divide 方法,第 10 行。
- at Main.main(Main.java:5) — Main 類別中的 main 方法,第 5 行。
每一行 at ... 都是堆疊中的一步。最上面那一行就是錯誤發生的位置。下面則是呼叫它的方法,依序往回追到程式一開始執行的地方。
2. 如何閱讀 Stack Trace?
步驟 1:找到例外型別與訊息
第一行一定包含錯誤的型別與說明:
java.lang.ArithmeticException: / by zero
這已經是提示:錯誤與除以零有關。
步驟 2:看第一個「at ...」
那就是實際發生錯誤的位置:
at Main.divide(Main.java:10)
表示錯誤發生在 Main 類別的 divide 方法,第 10 行。
步驟 3:沿著堆疊往上看
下一行會顯示是誰呼叫了這個方法:
at Main.main(Main.java:5)
也就是說,main 方法呼叫了 divide,錯誤隨之「往上拋」。行號是 5。
步驟 4:先找自己的類別
在很長的堆疊中,常會有系統方法(例如來自套件 java.util、java.io)。
你的類別通常在列表的前面。 看清類別名稱與檔名——先找出屬於你的!
3. 範例:解析一個真實的 Stack Trace
程式碼:
public class Main
{
public static void main(String[] args)
{
int result = divide(10, 0);
System.out.println("結果:" + result);
}
public static int divide(int a, int b)
{
return a / b;
}
}
錯誤:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.divide(Main.java:8)
at Main.main(Main.java:3)
解析:
- 錯誤:除以零(ArithmeticException)。
- 發生在 divide 方法的第 8 行。
- 由 main 方法在第 3 行呼叫。
該怎麼辦?
打開檔案 Main.java,找到第 8 行——就會看到除以零。修正它!
4. 含多個方法的 Stack Trace
程式碼:
public class Main
{
public static void main(String[] args)
{
process();
}
public static void process()
{
calculate();
}
public static void calculate()
{
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // 錯誤!
}
}
錯誤:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
at Main.calculate(Main.java:11)
at Main.process(Main.java:7)
at Main.main(Main.java:3)
解析:
- 錯誤:陣列索引越界(ArrayIndexOutOfBoundsException)。
- 發生在 calculate(第 11 行)。
- 由 process 呼叫(第 7 行)。
- 由 main 呼叫(第 3 行)。
結論:
Stack Trace 會顯示整條路徑,說明程式是如何一步步走到錯誤發生的位置。
5. 操作 Stack Trace 時的常見錯誤
錯誤 №1:忽視 Stack Trace。
初學者常常只看見「紅色錯誤」就不讀堆疊追蹤。別這樣!Stack trace — 是提示你在哪裡找臭蟲的線索。
錯誤 №2:把錯誤類型那一行和實際出錯的位置搞混。
重要:第一行 — 是錯誤的類型;而實際出錯的位置在第一個 at ... 條目。
錯誤 №3:到系統類別裡找錯。
如果你看到像 at java.base/java.util.Scanner.nextInt(Scanner.java:123) 這樣的行,先別急著去翻 Java 的原始碼。請查看在你的程式碼中是誰呼叫了這個方法。
錯誤 №4:不善用行號。
行號 — 是你最好的朋友。打開檔案,找到對應的那一行 — 你就會看見錯誤。
錯誤 №5:不理解 Stack Trace 是一條「路徑」。
Stack Trace 顯示程式是如何走到錯誤的位置。有時候臭蟲不在最上面那一行,而是在你呼叫方法的方式上。
GO TO FULL VERSION