Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách truy cập từng stack element của StackWalker trong Java 9

Java 9 StackWalker API thay thế Thread.getStackTrace(), Throwable.getStackTrace(), SecurityManager.getClassContext(). API nhắm đến cơ chế duyệt và materialize frame cần thiết, truy cập lười (lazy) frame thêm khi cần.

Để truy cập từng stack element của exception stack trace, dùng getStackTrace() của Throwable – trả về mảng StackTraceElement.

Ví dụ: Exception stack trace với getStackTrace()

import java.util.*;

// Test1 class
class Test1 {
    public void test() throws Exception {
        Test2 test2 = new Test2();
        test2.test();
    }
}

// Test2 class
class Test2 {
    public void test() throws Exception {
        System.out.println(1/0); // ArithmeticException
    }
}

// Main class
public class StackWalkerTest {
    public static void main(String args[]) {
        Test1 test1 = new Test1();
        try {
            test1.test();
        } catch(Exception e) {
            Arrays.stream(e.getStackTrace()).forEach(System.out::println);
        }
    }
}

Kết quả

Test2.test(StackWalkerTest.java:14)
Test1.test(StackWalkerTest.java:7)
StackWalkerTest.main(StackWalkerTest.java:23)

StackWalker vs Throwable.getStackTrace()

Đặc điểmThrowable.getStackTrace()StackWalker API
Trả vềStackTraceElement[] (array)Stream<StackFrame> (lazy)
Eager: capture toàn bộ stack ngayLazy: chỉ materialize khi consume
Filter/LimitKhó (cần loop manual)Dễ: filter(), limit(), skip(), map()
Class referenceKhông có (chỉ class name string)Có (Option.RETAIN_CLASS_REFERENCE)
Hidden framesKhôngCó (Option.SHOW_HIDDEN_FRAMES)
PerformanceKém cho stack sâuTốt (lazy, filtered)

Khi nào dùng cái nào?

  • Throwable.getStackTrace(): Exception handling thông thường, log error, đơn giản.
  • StackWalker API: Profiling, diagnostic tools, cần lọc frame, lấy Class object, performance-critical.

StackWalker API mạnh hơn, hiện đại hơn – nên dùng cho tooling, framework, advanced diagnostics.