CodeGym /課程 /JAVA 25 SELF /堆疊追蹤(Stack Trace)

堆疊追蹤(Stack Trace)

JAVA 25 SELF
等級 11 , 課堂 5
開放

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.utiljava.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 顯示程式是如何走到錯誤的位置。有時候臭蟲不在最上面那一行,而是在你呼叫方法的方式上。

1
任務
JAVA 25 SELF, 等級 11, 課堂 5
上鎖
烹飪計算器及其不愉快的驚喜 🥧
烹飪計算器及其不愉快的驚喜 🥧
1
任務
JAVA 25 SELF, 等級 11, 課堂 5
上鎖
英雄與他在物品欄中不存在的神器 🏹
英雄與他在物品欄中不存在的神器 🏹
1
任務
JAVA 25 SELF, 等級 11, 課堂 5
上鎖
程式偵探:調查報表系統故障 📉
程式偵探:調查報表系統故障 📉
1
任務
JAVA 25 SELF, 等級 11, 課堂 5
上鎖
深入探索:多層系統故障分析 🪆
深入探索:多層系統故障分析 🪆
1
問卷/小測驗
例外,等級 11,課堂 5
未開放
例外
例外
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION