堆棧跟踪 - 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
3
任務
Java Syntax,  等級 9課堂 1
上鎖
Code entry
Sometimes you don't need to think, you just need to hammer it out! As paradoxical as it may seem, sometimes your fingers will "remember" better than your conscious mind. That's why while training at the secret CodeGym center you will sometimes encounter tasks that require you to enter code. By entering code, you get used to the syntax and earn a little dark matter. What's more, you combat laziness.

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

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

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

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

1)我們得到調用堆棧。

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

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

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