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: Нерозуміння того, що стек викликів — це «шлях».
Стек викликів показує, як програма дійшла до помилки. Іноді помилка не в першому рядку стеку, а в тому, як ви викликали метод.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ