JavaRush /Курси /JAVA 25 SELF /Стек викликів (Stack Trace)

Стек викликів (Stack Trace)

JAVA 25 SELF
Рівень 11 , Лекція 5
Відкрита

1. Вступ

Стек викликів (Stack Trace) — це список методів, які були викликані у вашій програмі до моменту, коли сталася помилка (виняток). Коли у програмі виникає виняток, Java автоматично виводить стек викликів на екран. Це як «сліди на снігу»: ви бачите, якими кроками програма дійшла до помилки.

Аналогія:
Уявіть, що ви йдете лабіринтом і раптом упираєтеся в стіну. Стек викликів — це мапа, яка показує, якими коридорами ви йшли, перш ніж заблукати.

Як виглядає стек викликів?

Коли у програмі виникає помилка, Java виводить приблизно таке повідомлення:

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

Що тут зазначено?

  • Exception in thread "main" — у якому потоці виникла помилка (зазвичай "main").
  • java.lang.ArithmeticException: / by zero — тип винятку та його повідомлення.
  • at Main.divide(Main.java:10) — метод divide у класі Main, рядок 10.
  • at Main.main(Main.java:5) — метод main у класі Main, рядок 5.

Кожен рядок at ... — це крок у стеку викликів. Перший рядок у цьому списку — місце, де сталася помилка. Нижче — методи, які викликали цей метод, і так далі до самого початку програми.

2. Як читати стек викликів?

Крок 1. Знайдіть тип винятку і повідомлення

Перший рядок завжди містить тип помилки та її опис:

java.lang.ArithmeticException: / by zero

Це вже підказка: помилка повʼязана з діленням на нуль.

Крок 2. Дивіться на перший рядок «at ...»

Це місце, де фактично сталася помилка:

at Main.divide(Main.java:10)

Отже, помилка сталася в методі divide класу Main на 10-му рядку.

Крок 3. Підіймайтеся вгору стеком

Наступний рядок показує, хто викликав цей метод:

at Main.main(Main.java:5)

Отже, метод main викликав divide, і помилка «піднялася» вгору. Номер рядка — 5.

Крок 4. Шукайте свої класи

У довгому стеку викликів часто трапляються системні методи (наприклад, із пакетів java.util, java.io).
Ваші класи зазвичай розташовані ближче до початку списку. Дивіться на імена класів і файлів — шукайте свої!

3. Приклад: розбір реального стеку викликів

Код:

public class Main 
{
    public static void main(String[] args) 
    {
        int result = divide(10, 0);
        System.out.println("Результат: " + result);
    }

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

Помилка:

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

Розбираємо:

  • Помилка: ділення на нуль (ArithmeticException).
  • Сталася в методі divide на рядку 8.
  • Викликана з методу main на рядку 3.

Що робити?
Відкрийте файл Main.java, перегляньте рядок 8 — знайдете ділення на нуль. Виправте!

4. Стек викликів із кількома методами

Код:

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]); // Помилка!
    }
}

Помилка:

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)

Розбираємо:

  • Помилка: вихід за межі масиву (ArrayIndexOutOfBoundsException).
  • Сталася в calculate (рядок 11).
  • Викликана з process (рядок 7).
  • Викликана з main (рядок 3).

Висновок:
Стек викликів показує весь шлях, яким програма дійшла до помилки.

5. Типові помилки під час роботи зі стеком викликів

Помилка № 1: Ігнорування стеку викликів.
Початківці часто просто дивляться на «червоне повідомлення» та не читають стек викликів. Так не робіть! Стек викликів — це підказка, де шукати помилку.

Помилка № 2: Плутанина між рядком із типом помилки та рядком із місцем помилки.
Важливо: перший рядок — тип помилки, а місце помилки — у першому рядку at ....

Помилка № 3: Пошуки помилки в системних класах.
Якщо бачите рядки типу at java.base/java.util.Scanner.nextInt(Scanner.java:123), не поспішайте заглядати у вихідний код Java. Дивіться, хто викликав цей метод у вашому коді.

Помилка № 4: Ігнорування номерів рядків.
Номер рядка — ваш найкращий друг. Відкрийте файл, знайдіть потрібний рядок — і побачите помилку.

Помилка № 5: Нерозуміння того, що стек викликів — це «шлях».
Стек викликів показує, як програма дійшла до помилки. Іноді помилка не в першому рядку стеку, а в тому, як ви викликали метод.

1
Опитування
Виключення, рівень 11, лекція 5
Недоступний
Виключення
Виключення
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ