1. Введение
Stack Trace (стек вызовов) — это список методов, которые были вызваны в вашей программе до того момента, как произошла ошибка (исключение). Когда в программе возникает исключение, Java автоматически выводит стек вызовов на экран. Это как "следы на снегу": вы видите, по каким шагам программа пришла к ошибке.
Аналогия:
Представьте, что вы идёте по лабиринту и вдруг упираетесь в стену. Stack trace — это карта, показывающая, по каким коридорам вы шли, прежде чем заблудиться.
Как выглядит Stack Trace?
Когда в программе возникает ошибка, 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. Как читать Stack Trace?
Шаг 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. Пример: разбор реального Stack Trace
Код:
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. Stack Trace с несколькими методами
Код:
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).
Вывод:
Stack trace показывает весь путь, по которому программа пришла к ошибке.
5. Типичные ошибки при работе со Stack Trace
Ошибка №1: Игнорирование Stack Trace.
Новички часто просто смотрят на "красную ошибку" и не читают стек вызовов. Не делайте так! Stack trace — это подсказка, где искать баг.
Ошибка №2: Путают строку с ошибкой и строку с местом ошибки.
Важно: первая строка — тип ошибки, а место ошибки — в первой строке at ....
Ошибка №3: Ищут ошибку в системных классах.
Если видите строки типа at java.base/java.util.Scanner.nextInt(Scanner.java:123), не спешите лезть в исходники Java. Смотрите, кто вызвал этот метод в вашем коде.
Ошибка №4: Не используют номера строк.
Номер строки — ваш лучший друг. Откройте файл, найдите нужную строку — и увидите ошибку.
Ошибка №5: Не понимают, что Stack Trace — это "путь".
Stack trace показывает, как программа пришла к ошибке. Иногда баг не в самой верхней строке, а в том, как вы вызвали метод.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ