2017-08-29 66 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