Stackwalker within try-catch block java 9



我正在尝试在异常块中打印堆栈步行者,但它只显示当前类

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);
}
}
}

来自StackWalker文档:

walk 方法为当前线程打开顺序StackFrames流,然后应用给定函数来遍历StackFrame流。

由于您是从 main 方法调用它的 - 只分配了一个StackFrame并且正在打印:

TestStackWalker.main(TestStackWalker.java:10)

如果你想访问你的异常堆栈跟踪的每个堆栈元素 - 使用返回StackTraceElement数组的Throwable::getStackTrace

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应该足够了。

最新更新