สแต็กเทรซ - 1

"สวัสดี วันนี้ฉันจะบอกคุณว่าสแต็กเทรซคืออะไร แต่ก่อนอื่นฉันต้องบอกคุณก่อนว่าสแต็กคืออะไร"

"ลองนึกภาพกองเอกสาร – คำสั่งสำหรับพนักงานคนหนึ่ง คุณสามารถวางงานใหม่ไว้บนสุดของกอง หรือคุณสามารถรับงานจากด้านบน ซึ่งหมายความว่างานจะไม่ถูกดำเนินการตามลำดับที่ได้รับ . งานที่วางไว้บนกองล่าสุดจะเป็นงานแรกที่ดำเนินการโครงสร้างองค์ประกอบของคอลเลกชันด้วยวิธีนี้จะสร้างกอง "

" Java มีคอลเล็กชันพิเศษสำหรับสิ่งนั้น – Stackเป็นคอลเล็กชันที่มีวิธีการ 'เพิ่มองค์ประกอบ' และ 'รับ (รับ) องค์ประกอบ' อย่างที่คุณเดาได้ องค์ประกอบที่ถูกเพิ่มล่าสุดจะเป็นองค์ประกอบแรกที่ ถูกจับ"

"ฟังดูค่อนข้างตรงไปตรงมา"

"เยี่ยมมาก ตอนนี้ฉันจะอธิบายว่าสแต็กเทรซคืออะไร"

"ลองนึกภาพว่าในโปรแกรม Java วิธีการ Aเรียกว่าmethod Bซึ่งเรียกว่าmethod Cซึ่งต่อมาเรียกว่าmethod Dในการออกจากเมธอด Bเราต้องออกจากเมธอด C ก่อน และในการทำเช่นนั้น เราต้องออกจากเมธอด D ก่อน สิ่งนี้ พฤติกรรมคล้ายกับกอง "

“ทำไมถึงบอกว่าคล้าย”

"หากต้องการทำงานบางอย่างที่อยู่ตรงกลางกองกระดาษของเรา คุณต้องดำเนินการงานทั้งหมดที่อยู่ด้านบนก่อน"

"มีความคล้ายคลึงกัน แต่ฉันไม่แน่ใจว่าฉันเข้าใจทุกอย่างถูกต้อง"

"ดูสิ กองเป็นชุดขององค์ประกอบต่างๆ เหมือนกับเศษกระดาษในกอง ในการหยิบกระดาษแผ่นที่สามจากด้านบน คุณต้องหยิบชิ้นที่สองก่อน และสำหรับการนั้น คุณต้องหยิบชิ้นแรก คุณ ใส่และหยิบกระดาษได้ตลอดเวลา แต่คุณต้องเอากระดาษด้านบนออกก่อนเสมอ"

"เช่นเดียวกันกับการเรียกใช้ฟังก์ชันวิธีการ Aเรียกใช้เมธอด Bซึ่งเรียกใช้เมธอด CในการออกจากAคุณต้องออกจากB ก่อน และในการทำเช่นนั้น คุณต้องออกจากC "

"เดี๋ยวก่อน ถ้าฉันเข้าใจสิ่งที่คุณพูด แนวคิดทั้งหมดของสแต็กจะจบลงที่ 'นำกระดาษที่เพิ่มล่าสุด' และ 'คุณสามารถออกจากวิธีที่คุณป้อนล่าสุดเท่านั้น' ถูกต้องหรือไม่ "

"ใช่ ลำดับของการเรียกใช้ฟังก์ชันเรียกว่า 'call stack' หรือเรียกง่ายๆ ว่า 'stack' ฟังก์ชันสุดท้ายที่เรียกใช้คือฟังก์ชันแรกที่สิ้นสุดลองมาดูตัวอย่างกัน"

รับและแสดง call stack ปัจจุบัน:
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 Machine ติดตามการเรียกใช้ฟังก์ชันทั้งหมด ด้วยเหตุนี้จึงมีคอลเลกชันพิเศษ - สแต็ก เมื่อฟังก์ชันหนึ่งเรียกอีกฟังก์ชันหนึ่ง Java Machine จะใส่ออบเจกต์ StackTraceElement ใหม่ลงในสแต็ก เมื่อฟังก์ชันเสร็จสิ้น อิลิเมนต์นั้นจะถูกลบออก จากสแต็กซึ่งหมายความว่าสแต็กจะเก็บข้อมูลที่เป็นปัจจุบันอยู่เสมอเกี่ยวกับสถานะปัจจุบันของ 'การเรียกใช้ฟังก์ชันสแต็ก' "

"แต่ละ วัตถุ StackTraceElementมีข้อมูลเกี่ยวกับเมธอดที่เรียก โดยเฉพาะอย่างยิ่ง คุณสามารถรับชื่อเมธอดโดยใช้ เมธอด getMethodName "

"คุณสามารถดูวิธีการทำงานในตัวอย่างด้านบน:

1) เราได้รับคอลสแตก

2) เราใช้for-eachเพื่อผ่านมันไป ฉันหวังว่าคุณจะยังไม่ลืมว่ามันคืออะไร

3) เราส่งออกชื่อเมธอดไปที่System.out "

"น่าทึ่ง! และไม่ซับซ้อนเกินไป ขอบคุณ Rishi!"