Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 StackWalker API로 각 스택 요소에 접근하는 방법

Java 9에서는 Thread.getStackTrace(), Throwable.getStackTrace(), SecurityManager.getClassContext()의 대안으로 StackWalker API가 새롭게 도입되었습니다. 이 API는 필요한 스택 프레임만 순회(traverse)하고 구체화(materialize)하는 메커니즘을 제공하며, 추가적인 스택 프레임이 필요할 때 효율적으로 지연(lazy) 접근할 수 있도록 설계되었습니다.

예외(exception) 스택 트레이스의 각 스택 요소에 접근해야 하는 경우에는 Throwable 클래스의 getStackTrace() 메서드를 사용할 수 있습니다. 이 메서드는 StackTraceElement 객체들의 배열을 반환하며, 이를 스트림과 함께 활용하면 각 요소를 손쉽게 출력하거나 처리할 수 있습니다.

예제 코드

import java.util.*;

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

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

// Main 클래스
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)

위 예제에서 Test2 클래스에서 산술 예외(ArithmeticException)가 발생하면, catch 블록에서 getStackTrace()를 호출하여 스택 트레이스 정보를 가져옵니다. 반환된 배열은 Arrays.stream()을 통해 스트림으로 변환된 후, forEach()와 메서드 참조(System.out::println)를 이용해 각 스택 요소가 호출된 클래스명, 메서드명, 소스 파일명, 라인 번호와 함께 순차적으로 출력됩니다. 이처럼 스택 트레이스의 각 요소에 개별적으로 접근하면 디버깅이나 로깅 시 더욱 정밀한 분석이 가능합니다.