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

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

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

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

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

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

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