1. Giriş
Stack Trace (çağırış steki) — proqramınızda xəta (istisna) baş verənə qədər çağırılmış metodların siyahısıdır. Proqramda istisna yarandıqda, Java çağırış stekini avtomatik olaraq ekrana çıxarır. Bu, sanki “qar üzərindəki izlər” kimidir: proqramın səhvə hansı addımlarla gəldiyini görürsünüz.
Analoji:
Təsəvvür edin ki, labirintdə gedirsiniz və birdən divara dirənirsiniz. Stack trace — azmazdan əvvəl hansı dəhlizlərdən keçdiyinizi göstərən xəritədir.
Stack Trace necə görünür?
Proqramda xəta baş verdikdə, Java təxminən belə bir mesaj çıxarır:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.divide(Main.java:10)
at Main.main(Main.java:5)
Burada nə yazılıb?
- Exception in thread "main" — xəta hansı axında baş verib (adətən "main").
- java.lang.ArithmeticException: / by zero — istisnanın tipi və onun mesajı.
- at Main.divide(Main.java:10) — Main sinfindəki divide metodu, 10-cu sətir.
- at Main.main(Main.java:5) — Main sinfindəki main metodu, 5-ci sətir.
Hər bir at ... sətiri çağırış stekində bir addımdır. Ən yuxarı sətir — xətanın baş verdiyi yerdir. Daha aşağıda isə həmin metodu çağıran metodlar və s. proqramın başlanğıcına qədər göstərilir.
2. Stack Trace-i necə oxumaq?
Addım 1. İstisnanın tipini və mesajını tapın
Birinci sətir həmişə xətanın tipini və təsvirini ehtiva edir:
java.lang.ArithmeticException: / by zero
Bu artıq ipucudur: xəta sıfıra bölmə ilə bağlıdır.
Addım 2. İlk “at ...” sətirinə baxın
Bu, xətanın faktiki baş verdiyi yerdir:
at Main.divide(Main.java:10)
Deməli, xəta Main sinfinin divide metodunda 10-cu sətirdə baş verib.
Addım 3. Steklə yuxarı qalxın
Növbəti sətir bu metodu kimin çağırdığını göstərir:
at Main.main(Main.java:5)
Deməli, main metodu divide-i çağırıb və xəta “yuxarı” qalxıb. Sətir nömrəsi — 5.
Addım 4. Öz siniflərinizi axtarın
Uzun çağırış steklərində çox vaxt sistem metodları olur (məsələn, java.util, java.io paketlərindən).
Sizin siniflər adətən siyahının əvvəlində olur. Sinif və fayl adlarına baxın — özlərinizi axtarın!
3. Nümunə: real bir Stack Trace-in təhlili
Kod:
public class Main
{
public static void main(String[] args)
{
int result = divide(10, 0);
System.out.println("Nəticə: " + result);
}
public static int divide(int a, int b)
{
return a / b;
}
}
Xəta:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.divide(Main.java:8)
at Main.main(Main.java:3)
Təhlil edək:
- Xəta: sıfıra bölmə (ArithmeticException).
- divide metodunda, 8-ci sətirdə baş verib.
- main metodundan çağırılıb, 3-cü sətirdə.
Nə etməli?
Main.java faylını açırıq, 8-ci sətirə baxırıq — sıfıra bölməni tapırıq. Düzəliş edirik!
4. Bir neçə metodlu Stack Trace
Kod:
public class Main
{
public static void main(String[] args)
{
process();
}
public static void process()
{
calculate();
}
public static void calculate()
{
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // Səhv!
}
}
Xəta:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
at Main.calculate(Main.java:11)
at Main.process(Main.java:7)
at Main.main(Main.java:3)
Təhlil edək:
- Xəta: massiv sərhədlərindən kənara çıxma (ArrayIndexOutOfBoundsException).
- calculate daxilində baş verib (sətir 11).
- process-dən çağırılıb (sətir 7).
- main-dən çağırılıb (sətir 3).
Nəticə:
Stack trace proqramın səhvə aparan bütün yolu göstərir.
5. Stack Trace ilə işləyərkən tipik xətalar
Səhv №1: Stack Trace-i görməzdən gəlmək.
Yeni başlayanlar tez-tez sadəcə “qırmızı xətaya” baxır və çağırış stekini oxumurlar. Belə etməyin! Stack trace — problemi harada axtarmağı göstərən ipucudur.
Səhv №2: Xəta haqqında sətirlə xətanın baş verdiyi sətiri qarışdırmaq.
Vacibdir: birinci sətir — xətanın tipi, xətanın yeri isə ilk at ... sətirində göstərilir.
Səhv №3: Xətanı sistem siniflərində axtarmaq.
Əgər at java.base/java.util.Scanner.nextInt(Scanner.java:123) kimi sətirlər görürsünüzsə, tələsik Java-nın ilkin mənbə koduna baxmayın. Öz kodunuzda bu metodu kimin çağırdığına diqqət yetirin.
Səhv №4: Sətir nömrələrindən istifadə etməmək.
Sətir nömrəsi — ən yaxşı köməkçinizdir. Faylı açın, lazımi sətiri tapın — və xətanı görəcəksiniz.
Səhv №5: Stack Trace-in “yol” olduğunu anlamamaq.
Stack trace göstərir ki, proqram səhvə necə gəlib. Bəzən problem elə ən üst sətirdə deyil, metodu necə çağırmağınızdadır.
GO TO FULL VERSION