1. Stack trace əldə etmək
Java proqramlaşdırma dilində proqramçıda proqramda hazırda nə baş verdiyini öyrənmək üçün çoxlu üsulları var. Və bu sadəcə söz deyil.
Məsələn, C++ proqramlaşdırma dilindəki proqramlar kompilyasiya olunduqdan sonra böyük bir maşın kodu faylına çevrilir və iş vaxtı mövcud olan tək şey indi icra olunan maşın kodunun saxlandığı yaddaş ünvanıdır. Açığı, bu çox deyil.
Amma Java-da kompilyasiyadan sonra belə siniflər siniflər olaraq qalır, metodlar və dəyişənlər itmir, beləliklə proqramçıda proqramda indi baş verənlər haqqında məlumat əldə etmək üçün çoxlu üsulları var.
Stack trace
Məsələn, proqramın istənilən anında hazırda icra olunan metodu və sinifi öyrənmək mümkündür. Hətta bir metod yox, main()
metoduna qədər metodların çağırma zənciri haqqında məlumat əldə etmək mümkündür.
Müasir metod, onu çağıran metod, onu çağıran metod və s. ibarət siyahıya stack trace deyilir. Onu almaq üçün bu komandanı istifadə edə bilərik:
StackTraceElement[] methods = Thread.currentThread().getStackTrace();
Onu iki sətir olaraq da yazmaq olar:
Thread current = Thread.currentThread();
StackTraceElement[] methods = current.getStackTrace();
Thread
sinifinin currentThread()
statik metodu cari thread haqqında məlumat saxlayan Thread
obyektinə istinad qaytarır. Thread-lər haqqında daha çox Java Core kursunda öyrənəcəksiniz.
Bu Thread
obyektində getStackTrace()
metodu var, hansı ki, hər biri bir metod haqqında məlumat saxlayan StackTraceElement
elementlərindən ibarət array qaytarır. Bütün elementlər bir yerdə stack trace yaradır.
Nümunə:
Kod |
---|
|
Ekrana çıxış |
|
Ekrana çıxışdan gördüyümüz kimi, bu nümunədə getStackTrace()
metodu üç elementdən ibarət array qaytarıb:
Thread
sinifiningetStackTrace()
metoduMain
sinifinintest()
metoduMain
sinifininmain()
metodu
Bu stack trace-dən belə nəticə çıxarmaq olar ki:
Thread.getStackTrace()
metoduMain.test()
metodu tərəfindən Main.java faylının 11-ci sətrində çağırılıbMain.test()
metoduMain.main()
metodu tərəfindən Main.java faylının 5-ci sətrində çağırılıbMain.main()
heç kim tərəfindən çağırılmayıb — bu çağırma zəncirindəki ilk metoddur.
Bu arada, ekranda yalnız mövcud məlumatın bir hissəsi göstərilib. Qalan hər şeyi birbaşa StackTraceElement
obyektindən əldə etmək olar
2. StackTraceElement
StackTraceElement
sinfi, adına uyğun olaraq, bir stack trace elementinə - yəni StackTrace
-dən bir metoda aid məlumatları saxlamaq üçün yaradılıb.
Bu sinfin obyektləri üçün aşağıdakı metodlar mövcuddur:
Metod | Təsvir |
---|---|
|
Sinfin adını qaytarır |
|
Metodun adını qaytarır |
|
Faylın adını qaytarır (bir faylda bir neçə sinif ola bilər) |
|
Metodun çağırıldığı sətrin nömrəsini qaytarır |
|
Modulun adını qaytarır (null ola bilər) |
|
Modulun versiyasını qaytarır (null ola bilər) |
Bu metodlarla cari çağırış stack-i haqqında daha ətraflı məlumat ala bilərsiniz:
Kod | Ekrana çıxış | Qeyd |
---|---|---|
|
|
sinfin adı metodun adı faylın adı sətrin nömrəsi modulun adı modulun versiyası sinfin adı metodun adı faylın adı sətrin nömrəsi modulun adı modulun versiyası sinfin adı metodun adı faylın adı sətrin nömrəsi modulun adı modulun versiyası |
3. Stack
Stack Trace-in nə olduğunu artıq bilirsiz, bəs Stack (Stack) özünün nə olduğunu bilirsizmi?
Stack — bu, məlumatları saxlamaq üçün bir strukturdur. Buraya elementlər əlavə etmək və elementləri götürmək mümkündür. Amma elementləri yalnız sondan götürmək olar: əvvəl sonuncu əlavə edilən, sonra — ondan əvvəlki və s.
"Stack" adı ingilisdən tərcümədə "çalxalanma" deməkdir və kağız vərəqlərinin çalxası ilə çox oxşardır. Əgər siz kağız çalxasına 1, 2 və 3 nömrəli vərəqlər qoysanız, onları yalnız tərs qaydada götürə bilərsiniz: əvvəlcə üçüncü, sonra ikinci və yalnız sonra birinci vərəqi.
Java-da hətta bu cür davranışı olan və həmin addakı xüsusi bir kolleksiya da var — Stack. Bu sinif davranış baxımından ArrayList
və LinkedList
-ə çox oxşayır. Amma onun Stack davranışını həyata keçirən üsulları da var:
Metodlar | Təsvir |
---|---|
|
Elementi obj siyahının sonuna əlavə edir (çalxanın üstü) |
|
Çalxanın üstündən elementi götürür (çalxanın hündürlüyü azalır) |
|
Çalxanın üstündəki elementi qaytarır (çalxa dəyişmir) |
|
Kolleksiyanın boş olub-olmadığını yoxlayır |
|
Kolleksiyadan obyekt axtarır, onun index -ini qaytarır |
Nümunə:
Kod | Stack məzmunu (sağda üst) |
---|---|
|
|
Stack proqramlaşdırmada tez-tez istifadə olunur. Ona görə də, bu çox faydalı bir kolleksiyadır.
4. Xətaların emalında stack trace çıxışı
Metod çağırışlarının siyahısını niyə StackTrace adlandırıblar? Çünki metodların siyahısını metod adları olan vərəqlərdən ibarət bir yığın kimi təsəvvür etsək, hər yeni metod çağırıldığında həmin metodun adı ilə bir vərəq bu yığına əlavə olunur, onun üstünə - növbəti və s.
Metod tamamlandıqda, yığının üstündəki vərəq götürülür. Yığının ortasından bir vərəqi, onun üstündəki bütün vərəqləri götürmədən çıxarmaq mümkün deyil - metodları zəncirvarı çağırışlarda onun çağırdığı bütün metodlar tamamlanmadan dayandırmaq mümkün deyil.
İstisnalar
Stack-in başqa bir maraqlı istifadəsi - istisnaların emalıdır.
Proqramda səhv baş verəndə və istisna yaradıldığında, hazırkı stack trace ora yazılır: metodlar siyahısından ibarət olan bir massiv, main metodundan başlayaraq səhv baş verən metoda qədər gedir. Hətta istisnanın yaradıldığı sətir orda olur!
Bu xətanın stack trace-i istisnanın içində saxlanılır və ondan asanlıqla aşağıdakı metod vasitəsilə çıxarıla bilər: StackTraceElement[] getStackTrace()
Nümunə:
Kod | Qeyd |
---|---|
|
İstisnanı tuturuq Xətanın baş verdiyi anda onun stack trace-ni əldə edirik. |
Bu Throwable
sinfinin metodudur, yəni onun bütün törəmə sinifləri (yəni ümumiyyətlə bütün istisnalar) getStackTrace()
metoduna malikdir. Çox rahatdır, elə deyilmi?
Xətanın stack trace çapı
Yeri gəlmişkən, Throwable
sinfinin stack trace ilə işləmək üçün daha bir metodu var: o, stack trace-da saxlanılan bütün məlumatları konsola çıxarır. Onun adı printStackTrace()
-dır.
Bu metodu istənilən istisnada çağırmaq olar, çox rahatdır.
Nümunə:
Kod |
---|
|
Ekrana çıxış |
|
GO TO FULL VERSION