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

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流进行遍历。


由于您是从主方法调用它的,因此仅分配了一个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就足够了。

关于java - try catch 块Java 9中的Stackwalker,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58380018/

10-10 14:00