CodeGym /Kurslar /JAVA 25 SELF /Çağırış steki (Stack Trace)

Çağırış steki (Stack Trace)

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

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.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
İstisnalar
İstisnalar
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION