CodeGym /Các khóa học /JAVA 25 SELF /Stack Trace (ngăn xếp lời gọi)

Stack Trace (ngăn xếp lời gọi)

JAVA 25 SELF
Mức độ , Bài học
Có sẵn

1. Giới thiệu

Stack Trace (ngăn xếp lời gọi) — là danh sách các phương thức đã được gọi trong chương trình của bạn cho đến thời điểm xảy ra lỗi (exception). Khi chương trình phát sinh exception, Java sẽ tự động in Stack Trace ra màn hình. Nó giống như “dấu chân trên tuyết”: bạn thấy được chương trình đã đi theo những bước nào để dẫn đến lỗi.

Phép so sánh:
Hãy tưởng tượng bạn đang đi trong một mê cung và bất chợt đụng vào tường. Stack trace là tấm bản đồ cho thấy bạn đã đi qua những hành lang nào trước khi bị lạc.

Stack Trace trông như thế nào?

Khi trong chương trình xuất hiện lỗi, Java sẽ in ra một thông báo tương tự như sau:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.divide(Main.java:10)
    at Main.main(Main.java:5)

Ở đây có gì?

  • Exception in thread "main" — lỗi xảy ra trong luồng (thread) nào (thường là "main").
  • java.lang.ArithmeticException: / by zero — kiểu exception và thông điệp của nó.
  • at Main.divide(Main.java:10) — phương thức divide trong lớp Main, dòng 10.
  • at Main.main(Main.java:5) — phương thức main trong lớp Main, dòng 5.

Mỗi dòng at ... là một bước trong Stack Trace. Dòng trên cùng là nơi xảy ra lỗi. Bên dưới là các phương thức đã gọi phương thức đó, và cứ thế cho đến điểm bắt đầu của chương trình.

2. Cách đọc Stack Trace?

Bước 1. Tìm loại exception và thông điệp

Dòng đầu tiên luôn chứa kiểu lỗi và mô tả của nó:

java.lang.ArithmeticException: / by zero

Đây là một gợi ý: lỗi liên quan đến phép chia cho 0.

Bước 2. Nhìn vào dòng “at ...” đầu tiên

Đó là nơi lỗi thực sự xảy ra:

at Main.divide(Main.java:10)

Vậy lỗi xảy ra trong phương thức divide của lớp Main ở dòng 10.

Bước 3. Lần ngược lên ngăn xếp

Dòng tiếp theo cho biết ai đã gọi phương thức này:

at Main.main(Main.java:5)

Vậy phương thức main đã gọi divide, và lỗi “lan truyền” ngược lên. Số dòng — 5.

Bước 4. Tìm các lớp của bạn

Trong một Stack Trace dài thường có các phương thức hệ thống (ví dụ từ các package java.util, java.io).
Các lớp của bạn thường ở gần đầu danh sách. Hãy nhìn vào tên lớp và tên tệp — hãy tìm phần của bạn!

3. Ví dụ: phân tích một Stack Trace thực tế

Mã nguồn:

public class Main 
{
    public static void main(String[] args) 
    {
        int result = divide(10, 0);
        System.out.println("Kết quả: " + result);
    }

    public static int divide(int a, int b) 
    {
        return a / b;
    }
}

Lỗi:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.divide(Main.java:8)
    at Main.main(Main.java:3)

Phân tích:

  • Lỗi: chia cho 0 (ArithmeticException).
  • Xảy ra trong phương thức divide ở dòng 8.
  • Được gọi từ phương thức main ở dòng 3.

Cần làm gì?
Mở tệp Main.java, xem dòng 8 — sẽ thấy phép chia cho 0. Sửa lại!

4. Stack Trace với nhiều phương thức

Mã nguồn:

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]); // Lỗi!
    }
}

Lỗi:

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)

Phân tích:

  • Lỗi: truy cập vượt quá giới hạn mảng (ArrayIndexOutOfBoundsException).
  • Xảy ra trong calculate (dòng 11).
  • Được gọi từ process (dòng 7).
  • Được gọi từ main (dòng 3).

Kết luận:
Stack trace cho thấy toàn bộ đường đi mà chương trình đã đi đến lỗi.

5. Những sai lầm thường gặp khi làm việc với Stack Trace

Lỗi số 1: Bỏ qua Stack Trace.
Người mới thường chỉ nhìn “lỗi đỏ” và không đọc ngăn xếp lời gọi. Đừng làm vậy! Stack trace là gợi ý cho bạn biết nên tìm bug ở đâu.

Lỗi số 2: Nhầm lẫn giữa dòng mô tả lỗi và dòng vị trí lỗi.
Quan trọng: dòng đầu là kiểu lỗi, còn vị trí lỗi nằm ở dòng at ... đầu tiên.

Lỗi số 3: Tìm lỗi trong các lớp hệ thống.
Nếu thấy các dòng kiểu at java.base/java.util.Scanner.nextInt(Scanner.java:123), đừng vội xem mã nguồn Java. Hãy xem ai đã gọi phương thức này trong mã của bạn.

Lỗi số 4: Không dùng số dòng.
Số dòng là người bạn tốt nhất của bạn. Mở tệp, tìm đúng dòng — và bạn sẽ thấy lỗi.

Lỗi số 5: Không hiểu rằng Stack Trace là “con đường”.
Stack trace cho thấy cách chương trình đi đến lỗi. Đôi khi bug không nằm ở dòng trên cùng, mà ở cách bạn gọi phương thức.

1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Ngoại lệ
Ngoại lệ
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION