1. Mendapatkan jejak tindanan
Bahasa pengaturcaraan Java menawarkan banyak cara untuk pengaturcara mendapatkan maklumat tentang apa yang berlaku dalam program. Dan bukan hanya kata-kata.
Sebagai contoh, selepas program C++ disusun, ia menjadi satu fail besar yang penuh dengan kod mesin, dan semua yang tersedia untuk pengaturcara semasa masa jalan ialah alamat blok memori yang mengandungi kod mesin yang sedang dilaksanakan. Tidak banyak, katakan.
Tetapi untuk Java, walaupun selepas program disusun, kelas kekal sebagai kelas, kaedah dan pembolehubah tidak hilang, dan pengaturcara mempunyai banyak cara untuk mendapatkan maklumat tentang perkara yang berlaku dalam atur cara.
Jejak tindanan
Sebagai contoh, pada titik dalam pelaksanaan program, anda boleh mengetahui kelas dan nama kaedah yang sedang dilaksanakan. Dan bukan hanya satu kaedah — anda boleh mendapatkan maklumat tentang keseluruhan rangkaian panggilan kaedah daripada kaedah semasa kembali kepada kaedah main()
.
Senarai yang terdiri daripada kaedah semasa, dan kaedah yang menggunakan kaedah itu, dan kaedah yang memanggilnya, dsb. dipanggil surih tindanan . Anda boleh mendapatkannya dengan kenyataan ini:
StackTraceElement[] methods = Thread.currentThread().getStackTrace();
Anda juga boleh menulisnya sebagai dua baris:
Thread current = Thread.currentThread();
StackTraceElement[] methods = current.getStackTrace();
currentThread()
Kaedah statik Thread
kelas mengembalikan rujukan kepada Thread
objek, yang mengandungi maklumat tentang utas semasa, iaitu utas pelaksanaan semasa. Anda akan mengetahui lebih lanjut tentang urutan dalam Tahap 17 dan 18 pencarian Java Core .
Thread
Objek ini mempunyai getStackTrace()
kaedah, yang mengembalikan tatasusunan StackTraceElement
objek, setiap satunya mengandungi maklumat tentang kaedah. Jika digabungkan, semua elemen ini membentuk jejak tindanan .
Contoh:
Kod |
---|
|
Output konsol |
|
Seperti yang dapat kita lihat dalam output konsol contoh, getStackTrace()
kaedah itu mengembalikan tatasusunan tiga elemen:
getStackTrace()
kaedahThread
kelastest()
kaedahMain
kelasmain()
kaedahMain
kelas
Daripada jejak tindanan ini, kita boleh membuat kesimpulan bahawa:
- Kaedah ini
Thread.getStackTrace()
dipanggil olehMain.test()
kaedah pada baris 11 fail Main.java - Kaedah ini
Main.test()
dipanggil olehMain.main()
kaedah pada baris 5 fail Main.java - Tiada siapa yang memanggil
Main.main()
kaedah itu — ini adalah kaedah pertama dalam rangkaian panggilan.
By the way, hanya beberapa maklumat yang ada dipaparkan pada skrin. Segala-galanya boleh diperolehi terus dari StackTraceElement
objek
2.StackTraceElement
Seperti namanya, StackTraceElement
kelas telah dicipta untuk menyimpan maklumat tentang unsur surih tindanan , iaitu satu kaedah dalam stack trace
.
Kelas ini mempunyai kaedah contoh berikut:
Kaedah | Penerangan |
---|---|
|
Mengembalikan nama kelas |
|
Mengembalikan nama kaedah |
|
Mengembalikan nama fail (satu fail boleh mengandungi berbilang kelas) |
|
Mengembalikan nombor baris dalam fail tempat kaedah dipanggil |
|
Mengembalikan nama modul (ini boleh null ) |
|
Mengembalikan versi modul (ini boleh null ) |
Mereka boleh membantu anda mendapatkan maklumat yang lebih lengkap tentang timbunan panggilan semasa:
Kod | Output konsol | Catatan |
---|---|---|
|
|
nama kelas kaedah nama fail nama baris nombor modul nama modul versi nama kelas kaedah nama fail nama baris nombor modul nama modul versi nama kelas nama kaedah nama fail baris nombor modul nama modul versi |
3. Timbunan
Anda sudah tahu apa itu surih tindanan , tetapi apakah tindanan (kelas tindanan)?
Tindanan ialah struktur data yang mana anda boleh menambah elemen dan daripada mana anda boleh mendapatkan semula elemen. Dengan berbuat demikian, anda hanya boleh mengambil elemen dari penghujung: anda mula-mula mengambil yang terakhir ditambah, kemudian yang kedua ke yang terakhir ditambah, dsb.
Timbunan nama itu sendiri mencadangkan tingkah laku ini, seperti cara anda berinteraksi dengan timbunan kertas. Jika anda meletakkan helaian 1, 2 dan 3 dalam timbunan, anda perlu mendapatkannya dalam susunan terbalik: pertama helaian ketiga, kemudian helaian kedua, dan hanya kemudian helaian pertama.
Java juga mempunyai kelas koleksi Stack khas dengan nama dan tingkah laku yang sama. Kelas ini berkongsi banyak tingkah laku dengan ArrayList
dan LinkedList
. Tetapi ia juga mempunyai kaedah yang melaksanakan tingkah laku tindanan:
Kaedah | Penerangan |
---|---|
|
Menambah obj elemen ke bahagian atas timbunan |
|
Mengambil elemen dari bahagian atas tindanan (kedalaman tindanan berkurangan) |
|
Mengembalikan item di bahagian atas timbunan (timbunan tidak berubah) |
|
Menyemak sama ada koleksi kosong |
|
Mencari objek dalam koleksi dan mengembalikannyaindex |
Contoh:
Kod | Kandungan tindanan (bahagian atas tindanan berada di sebelah kanan) |
---|---|
|
|
Tindanan digunakan agak kerap dalam pengaturcaraan. Jadi ini adalah koleksi yang berguna.
4. Memaparkan surih tindanan semasa pengendalian pengecualian
Mengapakah senarai panggilan kaedah dipanggil jejak tindanan ? Kerana jika anda memikirkan senarai kaedah sebagai timbunan helaian kertas dengan nama kaedah, maka apabila anda memanggil kaedah seterusnya, anda menambah helaian dengan nama kaedah itu pada timbunan. Dan helaian kertas seterusnya diletakkan di atasnya, dan seterusnya.
Apabila kaedah tamat, helaian di bahagian atas tindanan dikeluarkan. Anda tidak boleh mengeluarkan helaian dari tengah tindanan tanpa mengeluarkan semua helaian di atasnya. Begitu juga, anda tidak boleh menamatkan kaedah di tengah-tengah rangkaian panggilan tanpa menamatkan semua kaedah yang telah dipanggil.
Pengecualian
Satu lagi kegunaan yang menarik untuk tindanan adalah semasa pengendalian pengecualian.
Apabila ralat berlaku dalam atur cara dan pengecualian dilemparkan , pengecualian mengandungi surih tindanan semasa — tatasusunan yang terdiri daripada senarai kaedah bermula, daripada kaedah utama dan berakhir dengan kaedah di mana ralat berlaku. Malah terdapat garis di mana pengecualian dilemparkan!
Surih tindanan ini disimpan di dalam pengecualian dan boleh diperoleh dengan mudah daripadanya menggunakan kaedah berikut:StackTraceElement[] getStackTrace()
Contoh:
Kod | Catatan |
---|---|
|
Tangkap pengecualian Dapatkan surih tindanan yang wujud apabila ralat berlaku. |
Ini ialah kaedah kelas Throwable
, jadi semua keturunannya (iaitu semua pengecualian) mempunyai getStackTrace()
kaedah itu. Sangat mudah, ya?
Paparkan surih tindanan pengecualian
Dengan cara ini, Throwable
kelas mempunyai kaedah lain untuk bekerja dengan surih tindanan, kaedah yang memaparkan semua maklumat surih tindanan yang disimpan di dalam pengecualian. Ia dipanggil printStackTrace()
.
Agak mudah, anda boleh memanggilnya pada sebarang pengecualian.
Contoh:
Kod |
---|
|
Output konsol |
|
GO TO FULL VERSION