Java 9 นำเสนอ StackWalker API เป็นทางเลือกแทน Thread.getStackTrace() หรือ Throwable.getStackTrace() และ SecurityManager.getClassContext() API นี้มุ่งให้กลไกเดินและสร้าง stack frames ที่จำเป็น อนุญาตให้เข้าถึง stack frames เพิ่มเติมแบบ lazy ได้อย่างมีประสิทธิภาพ
หากต้องการเข้าถึง stack element แต่ละตัวของ exception stack trace สามารถใช้เมธอด getStackTrace() ของคลาส Throwable คืนค่า array ของ StackTraceElement
ตัวอย่าง: ใช้ Throwable.getStackTrace()
import java.util.*;
class Test1 {
public void test() throws Exception {
Test2 test2 = new Test2();
test2.test();
}
}
class Test2 {
public void test() throws Exception {
System.out.println(1/0);
}
}
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);
}
}
}
ผลลัพธ์
Test2.test(StackWalkerTest.java:14)
Test1.test(StackWalkerTest.java:7)
StackWalkerTest.main(StackWalkerTest.java:23)
เปรียบเทียบ: StackWalker vs Throwable.getStackTrace()
| คุณสมบัติ | Throwable.getStackTrace() | StackWalker API |
|---|---|---|
| คืนค่า | StackTraceElement[] (array) | Stream<StackFrame> (lazy) |
| ประสิทธิภาพ | Capture ทั้ง stack ทุกครั้ง | Lazy, filter/skip/limit ได้ |
| ข้อมูล Class | ได้แค่ class name (String) | ได้ Class object (ต้อง RETAIN_CLASS_REFERENCE) |
| Hidden frames | ไม่แสดง | แสดงได้ด้วย SHOW_HIDDEN_FRAMES |
| Frame manipulation | ยาก (array) | ง่าย (Stream API) |