1. Njupuk tilak tumpukan

Njupuk tilak tumpukan

Basa pemrograman Java nawakake akeh cara kanggo programmer kanggo entuk informasi babagan apa sing kedadeyan ing program. Lan ora mung tembung.

Contone, sawise C ++ program sing nyawiji, padha dadi siji file gedhe kebak kode mesin, lan kabeh sing kasedhiya kanggo programmer ing runtime alamat pamblokiran memori sing ngemot kode mesin lagi dileksanakake. Ora akeh, ayo ngomong.

Nanging kanggo Jawa, sanajan program wis dikompilasi, kelas tetep kelas, metode lan variabel ora ilang, lan programmer duwe akeh cara kanggo entuk informasi babagan apa sing kedadeyan ing program kasebut.

Tilak tumpukan

Contone, ing titik ing eksekusi program, sampeyan bisa ngerteni kelas lan jeneng metode sing saiki dieksekusi. Lan ora mung siji cara - sampeyan bisa njaluk informasi babagan kabeh chain saka cara telpon saka cara saiki bali menyang cara main().

Dhaptar sing kasusun saka cara saiki, lan cara sing nimbali, lan cara sing disebut sing siji, etc.. disebut tilak tumpukan . Sampeyan bisa njaluk karo statement iki:

StackTraceElement[] methods = Thread.currentThread().getStackTrace();

Sampeyan uga bisa nulis minangka rong baris:

Thread current = Thread.currentThread();
StackTraceElement[] methods = current.getStackTrace();

Cara statis currentThread()saka Threadkelas ngasilake referensi menyang Threadobyek, sing ngemot informasi babagan thread saiki, yaiku thread eksekusi saiki. Sampeyan bakal sinau luwih lengkap babagan utas ing Level 17 lan 18 saka pencarian Java Core .

Obyek iki Threadnduweni getStackTrace()metode, sing ngasilake macem-macem StackTraceElementobyek, sing saben ngemot informasi babagan metode. Digabungake, kabeh unsur kasebut mbentuk jejak tumpukan .

Tuladha:

Kode
public class Main
{
   public static void main(String[] args)
   {
      test();
   }

   public static void test()
   {
      Thread current = Thread.currentThread();
      StackTraceElement[] methods = current.getStackTrace();

      for(var info: methods)
         System.out.println(info);
   }
}
Output konsol
java.base/java.lang.Thread.getStackTrace(Thread.java:1606)
Main.test(Main.java:11)
Main.main(Main.java:5)

Kaya sing bisa dideleng ing conto output konsol, getStackTrace()metode kasebut ngasilake telung unsur:

  • getStackTrace()metode Threadkelas
  • test()metode Mainkelas
  • main()metode Mainkelas

Saka jejak tumpukan iki, kita bisa nyimpulake yen:

  • Cara kasebut Thread.getStackTrace()diarani Main.test()metode ing baris 11 file Main.java
  • Cara kasebut Main.test()diarani Main.main()metode ing baris 5 file Main.java
  • Ora ana sing nyebut Main.main()cara kasebut - iki minangka cara pertama ing rantai telpon.

Miturut cara, mung sawetara informasi sing kasedhiya ditampilake ing layar. Kabeh liya bisa dipikolehi langsung saka StackTraceElementobyek kasebut



2.StackTraceElement

Minangka jeneng tabet, StackTraceElementkelas digawe kanggo nyimpen informasi bab unsur tilak tumpukan , IE siji cara ing stack trace.

Kelas iki nduweni metode conto ing ngisor iki:

Metode Katrangan
String getClassName()
Ngasilake jeneng kelas
String getMethodName()
Ngasilake jeneng metode
String getFileName()
Ngasilake jeneng file (siji file bisa ngemot pirang-pirang kelas)
int getLineNumber()
Ngasilake nomer baris ing file ing ngendi metode kasebut diarani
String getModuleName()
Ngasilake jeneng modul (bisa uga null)
String getModuleVersion()
Ngasilake versi modul (bisa uga null)

Bisa mbantu sampeyan entuk informasi sing luwih lengkap babagan tumpukan telpon saiki:

Kode Output konsol Cathetan
public class Main
{
   public static void main(String[] args)
   {
      test();
   }

   public static void test()
   {
      Thread current = Thread.currentThread();
      StackTraceElement[] methods = current.getStackTrace();

      for(StackTraceElement info: methods)
      {
         System.out.println(info.getClassName());
         System.out.println(info.getMethodName());

         System.out.println(info.getFileName());
         System.out.println(info.getLineNumber());

         System.out.println(info.getModuleName());
         System.out.println(info.getModuleVersion());
         System.out.println();
      }
   }
}
java.lang.Thread
getStackTrace
Thread.java
1606
java.base
11.0.2

Main
test
Main.java
11
null
null

Main
main
Main.java
5
null
null
nama kelas
metode nama file
nama
baris nomor
modul nama
modul versi

nama kelas
metode
nama file nama baris nomor modul nama modul versi nama kelas metode nama file nama baris nomor modul nama modul versi











3. Tumpukan

Sampeyan wis ngerti apa tilak tumpukan , nanging apa tumpukan (kelas Stack)?

Tumpukan minangka struktur data sing bisa ditambahake unsur lan saka ngendi sampeyan bisa njupuk unsur. Kanthi mengkono, sampeyan mung bisa njupuk unsur saka mburi: sampeyan njupuk sing pungkasan ditambahake, banjur sing kapindho kanggo pungkasan ditambahake, etc.

Tumpukan jeneng dhewe nuduhake prilaku iki, kaya carane sampeyan bakal sesambungan karo tumpukan kertas. Yen sampeyan sijine sheets 1, 2 lan 3 ing tumpukan, sampeyan kudu njupuk ing urutan mbalikke: pisanan sheet katelu, banjur kaloro, lan mung banjur pisanan.

Jawa malah duwe kelas koleksi Stack khusus kanthi jeneng lan prilaku sing padha. Kelas iki nuduhake akeh prilaku karo ArrayListlan LinkedList. Nanging uga duwe cara sing ngetrapake prilaku tumpukan:

Metode Katrangan
T push(T obj)
Nambahake objunsur ing ndhuwur tumpukan
T pop()
Njupuk unsur saka ndhuwur tumpukan (ambane tumpukan suda)
T peek()
Ngasilake item ing ndhuwur tumpukan (tumpukan ora owah)
boolean empty()
Priksa manawa koleksi kasebut kosong
int search(Object obj)
Nggoleki obyek ing koleksi lan ngasilakeindex

Tuladha:

Kode Isi tumpukan (ndhuwur tumpukan ana ing sisih tengen)
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
int x = stack.pop();
stack.push(4);
int y = stack.peek();
stack.pop();
stack.pop();

[1]
[1, 2]
[1, 2, 3]
[1, 2]
[1, 2, 4]
[1, 2, 4]
[1, 2]
[1]

Tumpukan digunakake cukup kerep ing program. Dadi iki koleksi migunani.



4. Nampilake tilak tumpukan sak pangecualian nangani

Napa dhaptar panggilan metode diarani jejak tumpukan ? Amarga yen sampeyan mikir dhaptar metode minangka tumpukan lembaran kertas kanthi jeneng metode, banjur nalika sampeyan nelpon metode sabanjure, sampeyan nambahake sheet kanthi jeneng metode kasebut menyang tumpukan kasebut. Lan lembaran kertas sabanjure dadi ndhuwur, lan liya-liyane.

Nalika cara ends, sheet ing ndhuwur tumpukan dibusak. Sampeyan ora bisa mbusak sheet saka tengah tumpukan tanpa mbusak kabeh sheets ndhuwur iku. Kajaba iku, sampeyan ora bisa mungkasi cara ing tengah chain telpon tanpa mungkasi kabeh cara sing wis disebut.

Pangecualian

Panggunaan liyane sing menarik kanggo tumpukan yaiku nalika nangani pangecualian.

Nalika ana kesalahan ing program lan pangecualian dibuwang , istiméwa ngemot tilak tumpukan saiki - Uploaded sing kasusun saka dhaftar cara miwiti, saka cara utama lan pungkasan karo cara ngendi kesalahan dumadi. Malah ana garis ing ngendi pangecualian dibuwang!

Tilak tumpukan iki disimpen ing pangecualian lan bisa gampang dijupuk saka iku nggunakake cara ing ngisor iki:StackTraceElement[] getStackTrace()

Tuladha:

Kode Cathetan
try
{
   // An exception may occur here
}
catch(Exception e)
{
   StackTraceElement[] methods = e.getStackTrace()
}




Nyekel pangecualian

Entuk tilak tumpukan sing ana nalika ana kesalahan.

Iki minangka metode kelas Throwable, mula kabeh turunane (yaiku kabeh pengecualian) duwe getStackTrace()metode kasebut. Super trep, huh?

Tampilake tilak tumpukan pangecualian

Miturut cara, Throwablekelas wis cara liyane kanggo nggarap ngambah tumpukan, cara sing nampilake kabeh informasi tilak tumpukan disimpen nang pangecualian. Iki diarani printStackTrace().

Cukup trep, sampeyan bisa nelpon ing sembarang istiméwa.

Tuladha:

Kode
try
{
   // An exception may occur here
}
catch(Exception e)
{
   e.printStackTrace();
}
Output konsol
java.base/java.lang.Thread.getStackTrace(Thread.java:1606)
Main.test(Main.java:11)
Main.main(Main.java:5)