Stacktrace – jak rozszyfrować Stacktrace w Twoim kodzie?

Stacktrace java

Stacktrace na pierwszy rzut oka, może przypominać zapis starożytnego manuskryptu – długi, zawiły i na pozór nie do rozszyfrowania. To zbiór linijek pełnych technicznego żargonu, który dla wielu jest jak labirynt bez wyjścia. Jednak, choć może wydawać się nieprzeniknioną ścianą tekstu, kryje w sobie klucze do najgłębiej skrywanych tajemnic Twojego kodu. Jest jak mapa, która prowadzi przez mroczne zaułki błędów i wyjątków, ostatecznie wskazując drogę do ich pokonania.

Stacktrace – wprowadzenie

Z tego materiału dowiesz się:

  • Co to jest stacktrace?
  • Kiedy poleci stacktrace?
  • Jak czytać stacktrace?

Stacktrace – co to?

Stacktrace, czyli ślad stosu, to zestawienie metod wywoływanych w trakcie działania programu aż do momentu wystąpienia wyjątku. Jest to swoista „ścieżka błędu”, która wskazuje, gdzie i dlaczego coś poszło nie tak. To jak fotograficzny zrzut miejsca „zbrodni” – pokazuje, gdzie dokładnie w Twoim kodzie pojawił się problem.

stacktrace

Kiedy dostaniemy stacktrace?

Stacktrace – pojawia się, gdy w Twoim programie Java zostanie rzucony wyjątek, a nie zostanie on obsłużony. Może to być wynik błędu logicznego, problemu z dostępem do zasobu lub każdej innej sytuacji, która zakłóca normalne działanie programu.

➡ ZOBACZ 👉: Exception, Wyjątek – Od Buga do Rozwiązania🪲⚙️

Jak czytać stacktrace?

  • Znajdź przyczynę wyjątku: Na początku stacktrace zawsze znajdziesz nazwę wyjątku oraz opcjonalnie komunikat, który opisuje problem. Jest to punkt wyjścia do zrozumienia, co poszło nie tak.
  • Zidentyfikuj miejsce wystąpienia wyjątku: Bezpośrednio po nazwie wyjątku znajduje się ślad (ang. stack trace), który zawiera listę metod wywołanych do momentu wystąpienia wyjątku. Pierwsza linijka po nazwie wyjątku wskazuje bezpośrednio na miejsce, gdzie wyjątek został rzucony lub gdzie wystąpił błąd. Zawiera nazwę klasy, metodę oraz numer linii w pliku źródłowym.
  • Przeanalizuj ścieżkę wywołań: Śledź ścieżkę wywołań od góry do dołu, aby zrozumieć, jak wykonanie programu prowadziło do błędu. Każda kolejna linijka wskazuje na poprzednie miejsce w kodzie, które wywołało metodę z linijki wyżej.
  • Szukaj kodu, który został napisany: W stacktrace mogą pojawiać się metody z bibliotek zewnętrznych lub frameworków. Skoncentruj się na tych częściach śladu, które odnoszą się do kodu aplikacji, który piszesz.

➡ ZOBACZ 👉: Debugowanie, jakiego jeszcze nie znałeś

Przykłady

👉NullPointerException | IOException | FileNotFoundException 

Kod

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ComplexExceptionExample {

    public static void main(String[] args) {
        try {
            initiateProcess();
        } catch (NullPointerException | IOException e) {
            // Rzucanie NullPointerException z wyjątkiem IOException jako przyczyną
            NullPointerException npe = new NullPointerException("Próba odwołania się do pola na obiekcie null");
            npe.initCause(e);
            throw npe;
        }
    }

    private static void initiateProcess() throws IOException {
        readFile();
    }

    private static void readFile() throws IOException {
        try {
            FileReader reader = new FileReader(new File("nieistniejacy_plik.txt"));
        } catch (FileNotFoundException e) {
            IOException ioException = new IOException("Błąd podczas odczytu pliku.");
            ioException.initCause(e);
            throw ioException;
        }
        processFile();
    }

    private static void processFile() {
        // Symulacja dalszej części procesu, która nie jest istotna dla wyjątku
        furtherProcessing();
    }

    private static void furtherProcessing() {
        // Tutaj mogłaby pojawić się dodatkowa logika...
        // Symulacja elipsy w stacktrace przez wywołanie metody, która rzuci wyjątek
        throw new RuntimeException("Dodatkowy wyjątek w procesie.");
    }
}

Stos

NullPointerException

 

Opis błędu👇

  • Exception in thread "main" ⇒ Informacja, że wyjątek wystąpił w wątku o nazwie „main”.
  • java.lang.NullPointerException ⇒ Typ wyjątku, który został rzucony.
  • Próba odwołania się do pola na obiekcie null ⇒ Opcjonalny komunikat wyjątku, który opisuje problem.

Miejsce wystąpienia👇

  • at ComplexExceptionExample.main(ComplexExceptionExample.java:13) ⇒ Wyjątek został rzucony lub zarejestrowany w metodzie main klasy ComplexExceptionExample.

Pierwsza przyczyna(Caused by): java.io.IOException👇

  • java.io.IOException: Błąd podczas odczytu pliku. ⇒ Informuje, że podczas operacji wejścia/wyjścia (I/O) wystąpił problem, konkretnie „Błąd podczas odczytu pliku”.

Ślad stosu dla IOException

  • at ComplexExceptionExample.readFile(ComplexExceptionExample.java:27) ⇒ Wskazuje, że IOException został rzucony w metodzie readFile klasy ComplexExceptionExample, w linii 27.
  • at ComplexExceptionExample.initiateProcess(ComplexExceptionExample.java:20) ⇒ Metoda initiateProcess wywołała readFile, co doprowadziło do błędu.
  • at ComplexExceptionExample.main(ComplexExceptionExample.java:10) ⇒ Metoda main wywołała initiateProcess, kontynuując ślad wywołań wstecz.

Druga przyczyna (Caused by): java.io.FileNotFoundException👇

  • java.io.FileNotFoundException: nieistniejacy_plik.txt (The system cannot find the file specified) ⇒ Ten wyjątek jest bardziej szczegółowy i wskazuje na próbę otwarcia pliku, który nie istnieje w systemie (nieistniejacy_plik.txt).

Ślad stosu dla FileNotFoundException

  • at java.base/java.io.FileInputStream.open0(Native Method) ⇒ Wskazuje, że błąd wystąpił w metodzie natywnej (nienapisanej w Javie, lecz w innym języku, np. C++).
  • at ComplexExceptionExample.readFile(ComplexExceptionExample.java:25) ⇒ Dokładne miejsce w kodzie użytkownika, gdzie próbowano otworzyć plik, co prowadzi do FileNotFoundException.

 

Powyższy stacktrace prezentuje złożoną sytuację, w której próba odczytu nieistniejącego pliku (FileNotFoundException) prowadzi do ogólnego błędu I/O (IOException), który z kolei jest przyczyną ostatecznego wyjątku (NullPointerException).

Fragment ... 2 more na końcu stacktrace wskazuje, że kolejne elementy śladu stosu są kontynuacją tych już przedstawionych wyżej, co jest standardowym sposobem skracania i unikania redundancji w prezentacji stacktrace.

Całość stacktrace pokazuje nie tylko bezpośrednią przyczynę błędu (NullPointerException), ale również łańcuch zdarzeń, które do niego doprowadziły, oferując pełniejszy kontekst problemu i ułatwiając debugowanie.

👉ArithmeticException

Kod

class ArithmeticExceptionExample {

    public static void main(String[] args) {
        divideNumbers(10, 0);
    }

    private static void divideNumbers(int numerator, int denominator) {
        // Próba dzielenia przez zero
        int result = numerator / denominator;
        System.out.println("Wynik dzielenia: " + result);
    }
}

Stos

ArithmeticException

 

Wyjątek👇

  • java.lang.ArithmeticException: / by zero ⇒ Ten komunikat informuje, że wystąpił błąd dzielenia przez zero. Jest to bezpośrednia przyczyna wyjątku.

Lokalizacja👇

  • at ArithmeticExceptionExample.divideNumbers(ArithmeticExceptionExample.java:8) ⇒ Wskazuje na dokładną linijkę kodu, gdzie wystąpił błąd – próba wykonania operacji dzielenia przez zero w metodzie divideNumbers.
  • at ArithmeticExceptionExample.main(ArithmeticExceptionExample.java:4) ⇒ Wskazuje, że metoda main wywołała metodę divideNumbers, która jest źródłem wyjątku.

ArithmeticException jest wyjątkiem czasu wykonania, który wskazuje na błędy w operacjach arytmetycznych, takie jak dzielenie przez zero. Jest to przykład, jak błędy logiczne w kodzie są sygnalizowane przez Javę.

Stacktrace – podsumowanie

Analiza stacktrace wymaga zwrócenia uwagi na typ wyjątku i komunikat błędu, a następnie prześledzenia ścieżki wywołań, aby zidentyfikować miejsce i przyczynę problemu. Pamiętaj, że błędy są nieodłączną częścią procesu programowania, a stacktrace to Twój przewodnik, jak z nich wyciągać wartościowe lekcje.

➡ ZOBACZ 👉:  Kurs Java | Darmowy Kurs Programowania w Javie


20+ BONUSOWYCH materiałów z programowania

e-book – „8 rzeczy, które musisz wiedzieć, żeby dostać pracę jako programista”,
e-book – „Java Cheat Sheet”,
checklista – „Pytania rekrutacyjne”
i wiele, wiele wiecej!

Jak zostać programistą

No comments
Share:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *