当您调试运行某些并行线程的复杂Java代码时,捕获所有断点并不容易,有时很难找到导致问题的路径。在这种情况下,我们需要在可疑位置打印方法调用堆栈。如何在Java中打印方法调用堆栈?
答案 0 :(得分:3)
以下是如何从源文件中的给定位置打印堆栈跟踪。
System.out.println("Printing stack trace:");
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for (int i = 1; i < elements.length; i++) {
StackTraceElement s = elements[i];
System.out.println("\tat " + s.getClassName() + "." + s.getMethodName() + "(" + s.getFileName() + ":" + s.getLineNumber() + ")");
}
答案 1 :(得分:0)
只需使用以下代码
System.out.println("Stack trace:");
StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();
for (int i = 1; i < stackTraces.length; i++) {
System.out.println(stackTraces[i]);
}
这是StackTraceElement的toString方法的定义
public String toString() {
return getClassName() + "." + methodName +
(isNativeMethod() ? "(Native Method)" :
(fileName != null && lineNumber >= 0 ?
"(" + fileName + ":" + lineNumber + ")" :
(fileName != null ? "("+fileName+")" : "(Unknown Source)")));
}
因此您可以直接使用打印StackTraceElement。
答案 2 :(得分:0)
使用 Java 8
Arrays.stream(Thread.currentThread().getStackTrace()).forEach(s -> System.out.println(
"\tat " + s.getClassName() + "." + s.getMethodName() + "(" + s.getFileName() + ":" + s
.getLineNumber() + ")"));