Stackwalker в блоке try-catch Java 9 - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь распечатать стек в блоке исключений, но он отображает только текущий класс

public class Test1 {
    public void test() throws Exception{
        Test2 test2 = new Test2();
        test2.test();
    }
}
public class Test2 {
    public void test() throws Exception{
        System.out.println(1/0);
    }
}
public class TestStackWalker {
      public static void main(String[] args) {
        Test1 test1 = new Test1();
        try {
            test1.test();
        } catch (Exception e) {
           StackWalker stack = StackWalker.getInstance();
           stack.forEach(System.out::println);
        }
    }
}

1 Ответ

1 голос
/ 14 октября 2019

С StackWalker документы:

Метод обхода открывает последовательный поток StackFrames для текущего потока, а затем применяет данную функцию для обхода StackFrame stream.

Поскольку вы вызываете его из основного метода - выделен только один StackFrame, который печатается:

TestStackWalker.main(TestStackWalker.java:10)

Если вы хотите иметь доступ ккаждый элемент стека трассировки стека вашего исключения - используйте Throwable::getStackTrace, который возвращает массив StackTraceElement:

class TestStackWalker {
    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(Test2.java:3)
Test1.test(Test1.java:4)
TestStackWalker.main(TestStackWalker.java:7)

ЕслиВы хотите только напечатать это Throwable::printStackTrace должно быть достаточно.

...