2017-08-29 93 views
-3

当您调试一些运行了一些并行线程的复杂Java代码时,捕获所有断点并不容易,有时很难找到哪个路径导致了问题。在这种情况下,我们需要在可疑位置打印方法调用堆栈。如何在Java中打印方法调用堆栈?如何打印java方法调用堆栈?

+5

你最好使用像IntelliJ这样的真正的IDE。它显示你完整的堆栈和更多。 – duffymo

回答

1

以下是您如何打印源文件中给定位置的堆栈跟踪。

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() + ")"); 
} 
+3

我不认为这给你更多的信息比在IDE中使用调试器会给你。另外,它不会让你有机会让你看到变量的值,就像调试器一样。我无法想象任何情况下,这将是有用的。这看起来对我来说,你已经带来了一辆自行车到F1。 –

+0

正确,但不是很有用。 – duffymo

+2

更容易新Throwable()。printStacktrace() –

-1

下面的代码

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。

+0

为什么downvoting? – nagendra547