Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีเข้าถึง stack element แต่ละตัวของ StackWalker ใน Java 9

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()

StackFrame methods

  • getClassName() - String
  • getMethodName() - String
  • getLineNumber() - int
  • getFileName() - String
  • getDeclaringClass() - Class<?> (ต้อง RETAIN_CLASS_REFERENCE)
  • isNativeMethod() - boolean

StackWalker API ให้ความยืดหยุ่นและประสิทธิภาพดีกว่าสำหรับการวิเคราะห์ stack trace แบบละเอียด

คุณสมบัติ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)