CodeGym /Kursy /JAVA 25 SELF /Stos wywołań (Stack Trace)

Stos wywołań (Stack Trace)

JAVA 25 SELF
Poziom 11 , Lekcja 5
Dostępny

1. Wprowadzenie

Stack Trace (stos wywołań) — to lista metod, które zostały wywołane w twoim programie do momentu wystąpienia błędu (wyjątku). Gdy w programie pojawia się wyjątek, Java automatycznie wypisuje stos wywołań na ekran. To jak „ślady na śniegu”: widzisz, jakimi krokami program doszedł do błędu.

Analogia:
Wyobraź sobie, że idziesz labiryntem i nagle trafiasz na ścianę. Stack trace — to mapa pokazująca, którymi korytarzami szedłeś, zanim się zgubiłeś.

Jak wygląda Stack Trace?

Gdy w programie wystąpi błąd, Java wyświetla mniej więcej taki komunikat:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.divide(Main.java:10)
    at Main.main(Main.java:5)

Co tutaj widzimy?

  • Exception in thread "main" — w którym wątku wystąpił błąd (zwykle "main").
  • java.lang.ArithmeticException: / by zero — typ wyjątku i jego komunikat.
  • at Main.divide(Main.java:10) — metoda divide w klasie Main, wiersz 10.
  • at Main.main(Main.java:5) — metoda main w klasie Main, wiersz 5.

Każdy wiersz at ... — to krok na stosie wywołań. Najwyższy wiersz — miejsce, w którym wystąpił błąd. Niżej są metody, które wywołały tę metodę, i tak dalej aż do początku programu.

2. Jak czytać Stack Trace?

Krok 1. Znajdź typ wyjątku i komunikat

Pierwsza linia zawsze zawiera typ błędu i jego opis:

java.lang.ArithmeticException: / by zero

To już podpowiedź: błąd dotyczy dzielenia przez zero.

Krok 2. Spójrz na pierwszy wiersz „at ...”

To miejsce, gdzie faktycznie wystąpił błąd:

at Main.divide(Main.java:10)

Zatem błąd wystąpił w metodzie divide klasy Main w wierszu 10.

Krok 3. Idź w górę stosu

Kolejny wiersz pokazuje, kto wywołał tę metodę:

at Main.main(Main.java:5)

Zatem metoda main wywołała divide, a błąd „poszedł” w górę stosu. Numer wiersza — 5.

Krok 4. Szukaj swoich klas

W długim stosie wywołań często pojawiają się metody systemowe (np. z pakietów java.util, java.io).
Twoje klasy zwykle są bliżej początku listy. Patrz na nazwy klas i plików — szukaj swoich!

3. Przykład: analiza rzeczywistego Stack Trace

Kod:

public class Main 
{
    public static void main(String[] args) 
    {
        int result = divide(10, 0);
        System.out.println("Wynik: " + result);
    }

    public static int divide(int a, int b) 
    {
        return a / b;
    }
}

Błąd:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.divide(Main.java:8)
    at Main.main(Main.java:3)

Analizujemy:

  • Błąd: dzielenie przez zero (ArithmeticException).
  • Wystąpił w metodzie divide w wierszu 8.
  • Wywołany z metody main w wierszu 3.

Co zrobić?
Otwórz plik Main.java, przejdź do wiersza 8 — znajdziesz dzielenie przez zero. Popraw to!

4. Stack Trace z kilkoma metodami

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]); // Błąd!
    }
}

Błąd:

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)

Analizujemy:

  • Błąd: wyjście poza zakres tablicy (ArrayIndexOutOfBoundsException).
  • Wystąpił w calculate (wiersz 11).
  • Wywołany z process (wiersz 7).
  • Wywołany z main (wiersz 3).

Wniosek:
Stack trace pokazuje całą ścieżkę, którą program doszedł do błędu.

5. Typowe błędy przy pracy ze Stack Trace

Błąd nr 1: Ignorowanie Stack Trace.
Początkujący często patrzą tylko na „czerwony błąd” i nie czytają stosu wywołań. Nie rób tak! Stack trace — to wskazówka, gdzie szukać błędu.

Błąd nr 2: Mylenie linii błędu i miejsca wystąpienia błędu.
Ważne: pierwsza linia — to typ błędu, a miejsce błędu jest w pierwszym wierszu at ....

Błąd nr 3: Szukanie błędu w klasach systemowych.
Jeśli widzisz wpisy typu at java.base/java.util.Scanner.nextInt(Scanner.java:123), nie spiesz się z zaglądaniem do źródeł Javy. Sprawdź, kto wywołał tę metodę w twoim kodzie.

Błąd nr 4: Nieużywanie numerów wierszy.
Numer wiersza — twój najlepszy przyjaciel. Otwórz plik, znajdź właściwy wiersz — i zobaczysz błąd.

Błąd nr 5: Brak zrozumienia, że Stack Trace to „ścieżka”.
Stack trace pokazuje, jak program doszedł do błędu. Czasem błąd nie jest w najwyższym wierszu, lecz w tym, jak wywołałeś metodę.

1
Ankieta/quiz
Wyjątki, poziom 11, lekcja 5
Niedostępny
Wyjątki
Wyjątki
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION