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ę.
GO TO FULL VERSION