堆棧跟踪 - 1

“嗨!今天我會告訴你什麼是堆棧跟踪。但首先我需要告訴你什麼是堆棧。”

“想像一堆文件——給某個員工的指令。你可以把一個新任務放在這堆文件的最上面,或者你可以從最上面拿一個任務。這意味著任務不會按照收到的順序執行.最近放在堆上的任務將最先執行。以這種方式構建集合的元素形成堆棧

Java 對此有一個特殊的集合 – Stack。它是一個具有‘添加元素’和‘獲取(獲取)元素’的方法的集合。您可能已經猜到了,最後添加的元素將是第一個添加的元素。被帶走。”

“聽起來很簡單。”

“太好了。現在我將解釋堆棧跟踪是什麼。”

“想像一下,在一個 Java 程序中,方法 A調用方法 B方法 B調用方法C ,方法 C 又調用方法 D。要退出方法 B ,我們必須先退出方法 C,為此,我們必須先退出方法 D。這行為類似於堆棧。”

“為什麼說很像呢?”

“例如,要完成我們一堆文件中間的某個任務,您首先需要執行位於它上面的所有任務。”

“有一些相似之處,但我不確定我是否正確理解了所有內容。”

“看。堆棧是一組元素。就像一堆紙。要從頂部拿第三張紙,您首先需要拿第二張紙,為此,您需要拿第一張紙。你總是可以放和拿紙片,但你總是要先拿最上面的紙。”

“函數調用也是如此。方法 A調用方法 B,方法 B 調用方法 C 。要退出A,您必須先退出B,為此,您需要退出C。”

“等等。如果我明白你在說什麼,堆棧的整個概念歸結為‘拿走最後添加的那張紙’和‘你只能退出你最近進入的方法’。這樣說準確嗎? “

“是的。函數調用的順序被稱為‘調用堆棧’或簡稱為‘堆棧’。最後調用的函數是第一個結束的函數。讓我們深入研究一個例子。”

獲取並顯示當前調用堆棧:
public class ExceptionExample
{
  public static void main(String[] args)
  {
    method1();
  }

  public static void method1()
  {
    method2();
  }

  public static void method2()
  {
    method3();
  }

  public static void method3()
  {
     StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : stackTraceElements)
    {
       System.out.println(element.getMethodName());
    }
  }
}
結果:
getStackTrace
method3
method2
method1
main

“好的。我了解有關函數調用的所有信息。但是這個 StackTraceElement 是什麼?”

“Java 機器跟踪所有函數調用。為此,它有一個特殊的集合——堆棧。當一個函數調用另一個函數時,Java 機器將一個新的 StackTraceElement 對象放到堆棧上。當一個函數完成時,該元素將刪除來自堆棧。這意味著堆棧始終存儲有關“函數調用堆棧”當前狀態的最新信息。

“每個StackTraceElement對像都包含有關被調用方法的信息。特別是,您可以使用getMethodName方法獲取方法名稱。”

“你可以在上面的例子中看到它是如何工作的:

1)我們得到調用堆棧。

2) 我們使用for-each循環來遍歷它。我希望你沒有忘記那是什麼。

3) 我們將方法名稱輸出到System.out。”

“令人著迷!而且也不太複雜。謝謝你,Rishi!”