Jejak tindanan - 1

"Hai! Hari ini saya akan memberitahu anda apa itu surih tindanan. Tetapi pertama-tama saya perlu memberitahu anda apa itu tindanan."

"Bayangkan timbunan kertas – arahan untuk pekerja tertentu. Anda boleh meletakkan tugas baharu di atas longgokan, atau anda boleh mengambil tugasan dari atas. Ini bermakna tugas tidak akan dilaksanakan mengikut susunan yang diterima. . Tugasan yang diletakkan pada longgokan paling baru akan menjadi yang pertama dilaksanakan. Menstrukturkan elemen koleksi dengan cara ini membentuk timbunan . "

" Java mempunyai koleksi khas untuk itu – Stack . Ia adalah koleksi yang mempunyai kaedah untuk 'menambah elemen' dan 'mengambil (mendapatkan) elemen'. Seperti yang anda mungkin telah meneka, elemen yang telah ditambah terakhir akan menjadi yang pertama untuk diambil."

"Bunyi agak mudah."

"Bagus. Sekarang saya akan terangkan apa itu jejak tindanan ."

"Bayangkan bahawa dalam kaedah program Java A yang dipanggil kaedah B , yang dipanggil kaedah C , yang seterusnya dipanggil kaedah D . Untuk keluar dari kaedah B , kita mesti keluar dahulu kaedah C , dan untuk melakukannya – kita mesti keluar dari kaedah D dahulu . Ini tingkah laku menyerupai timbunan."

"Kenapa awak kata ia menyerupainya?"

"Untuk mencapai beberapa tugas di tengah-tengah timbunan kertas kami, sebagai contoh, anda perlu melaksanakan semua tugasan yang terletak di atasnya."

"Ada sedikit persamaan, tetapi saya tidak pasti saya memahami semuanya dengan betul."

"Lihat. Timbunan ialah satu set elemen. Seperti kepingan kertas dalam longgokan. Untuk mengambil sekeping kertas ketiga dari atas, pertama anda perlu mengambil yang kedua, dan untuk itu, anda perlu mengambil yang pertama. Anda sentiasa boleh meletakkan dan mengambil kepingan kertas, tetapi anda sentiasa perlu mengambil kertas teratas dahulu."

"Hal yang sama berlaku untuk panggilan fungsi. Kaedah A memanggil kaedah B , yang memanggil kaedah C . Untuk keluar dari A , anda mesti keluar dari B dahulu dan untuk melakukannya, anda perlu keluar dari C ."

"Tunggu. Jika saya faham apa yang anda katakan, keseluruhan konsep timbunan bermuara kepada 'mengambil sekeping kertas yang terakhir ditambah' dan 'anda hanya boleh keluar dari kaedah yang paling baru anda masukkan'. Adakah itu tepat? "

"Ya. Urutan panggilan fungsi dikenali sebagai 'tindanan panggilan' atau ringkasnya 'tindanan'. Fungsi terakhir yang dipanggil ialah fungsi pertama untuk ditamatkan. Mari kita gali contoh."

Dapatkan dan paparkan timbunan panggilan semasa:
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());
    }
  }
}
Keputusan:
getStackTrace
method3
method2
method1
main

"OK. Saya mendapat segalanya tentang panggilan fungsi. Tetapi apakah StackTraceElement ini?"

"Mesin Java menjejaki semua panggilan fungsi. Untuk itu, ia mempunyai koleksi khas - timbunan. Apabila satu fungsi memanggil yang lain, Mesin Java meletakkan objek StackTraceElement baharu pada tindanan. Apabila fungsi selesai, elemen itu dialih keluar daripada timbunan. Ini bermakna timbunan sentiasa menyimpan maklumat terkini tentang keadaan semasa 'timbunan panggilan fungsi'. "

"Setiap objek StackTraceElement mengandungi maklumat tentang kaedah yang dipanggil. Khususnya, anda boleh mendapatkan nama kaedah menggunakan kaedah getMethodName ."

"Anda boleh melihat cara ini berfungsi dalam contoh di atas:

1) Kami mendapat timbunan panggilan.

2) Kami menggunakan gelung untuk-setiap untuk melaluinya. Saya harap anda tidak lupa apa itu.

3) Kami mengeluarkan nama kaedah ke System.out ."

"Menarik! Dan tidak terlalu rumit juga. Terima kasih, Rishi!"