Перейти к основному содержимому

Отладка Java-кода в IDE

Разработчику

Отладка Java-кода в IDE

Отладка (debugging) — поиск и устранение ошибок в программе. Отладчик позволяет приостанавливать выполнение в заданных точках, просматривать значения переменных, выполнять код пошагово и анализировать стек вызовов.

СпособПлюсыМинусы
Отладчик IDEВизуальный анализ, пошаговое выполнение, все переменные в области видимостиНужна настройка среды
System.out.println()Просто, без специальных инструментовЗагромождает код, ограниченная информация

Точка останова и запуск

  1. Откройте файл в редакторе.
  2. Щёлкните слева от номера строки — появится красная точка (breakpoint).
  3. Запустите отладку: Shift+F9 в IntelliJ IDEA (или кнопка с жуком).

Пример для пошагового разбора:

public class DebugExample {
public static void main(String[] args) {
int[] numbers = {5, 2, 8, 1, 9, 3};
int max = findMax(numbers); // breakpoint здесь
System.out.println("Максимум: " + max);
}

public static int findMax(int[] array) {
int max = array[0];
for (int i = 0; i <= array.length; i++) { // ошибка: <= вместо <
if (array[i] > max) {
max = array[i];
}
}
return max;
}
}

Отладчик остановится на breakpoint и покажет, что цикл выходит за границы массива.


Команды отладчика (IntelliJ IDEA)

КомандаКлавишаДействие
Шаг с заходомF7Выполняет строку, заходит внутрь методов
Шаг с обходомF8Выполняет строку, не заходя в методы
Шаг с выходомShift+F8Выходит из текущего метода
ПродолжитьF9До следующей точки останова
ОстановитьCtrl+F2Завершить сеанс отладки

Панели отладчика

  • Variables — значения локальных переменных и полей объектов.
  • Frames (Call Stack) — цепочка вызовов методов от main до текущей строки.
  • Breakpoints — список всех точек останова; можно задать условие (например, i > 5).

Условная точка останова

Полезна в циклах, когда нужно остановиться только при определённом значении:

public class ConditionalBreakpoint {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("Итерация: " + i); // условие: i > 5
}
}
}

В IntelliJ IDEA: правый клик на breakpoint → More → поле Condition.


Пример: отладка алгоритма

public class SecondMaxDebug {
public static void main(String[] args) {
int[] numbers = {8, 3, 12, 5, 9, 1, 7};
int result = findSecondMax(numbers);
System.out.println("Второй максимум: " + result);
}

public static int findSecondMax(int[] array) {
int max = array[0];
int secondMax = Integer.MIN_VALUE;

for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
secondMax = max;
max = array[i];
} else if (array[i] > secondMax) {
secondMax = array[i];
}
}
return secondMax;
}
}

Задание: поставьте breakpoint на первой строке цикла и проследите, как меняются max и secondMax на каждой итерации.


Пример: отладка рекурсии

public class FactorialDebug {
public static void main(String[] args) {
int n = 5;
long result = factorial(n);
System.out.println(n + "! = " + result);
}

public static long factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
}

В панели Frames видно вложенные вызовы factorial(5)factorial(4) → … → factorial(1).


Удалённая отладка (JVM)

Для приложений без IDE можно включить JDWP:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

IDE подключается к порту 5005 и работает так же, как с локальным процессом. Подробнее — в «Справочнике по Java».

Практическое задание
В цикле ниже ошибка границы: сумма 1..10 должна быть 55, а не 66. Найдите её через отладчик (F8 по итерациям) и исправьте условие цикла.

public class DebugQuiz {
public static void main(String[] args) {
int sum = 0;
for (int i = 0; i <= 10; i++) {
sum += i;
}
System.out.println("Сумма 1..10: " + sum);
}
}

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).