1. Bug
У программистов есть свой сленг. И первым словом, с которым вы познакомитесь плотно, будет баг (от англ. bug — жук). Это слово обозначает ошибку в программе, из-за которой она делает что-то не то, падает или выдает странный результат.
Если программа работает странно, но программист уверяет, что так и было задумано, обычно говорят: «Это не баг, это фича». Интернет полон мемов на эту тему.
Историческая справка
Легенда гласит, что в сентябре 1947 года ученые Гарварда тестировали компьютер Mark II. Он сбоил. Проверив все контакты, они нашли настоящего мотылька, застрявшего между реле. Насекомое вклеили в журнал с подписью «First actual case of bug being found» (Первый реальный случай найденного жука).
С тех пор процесс поиска и устранения ошибок называют дебаг или отладка.

2. Debug Mode
Чтобы найти ошибку, программисты используют Debugger. Это специальный инструмент внутри IntelliJ IDEA, который позволяет поставить выполнение программы на паузу и заглянуть ей "под капот".
Intellij IDEA может запустить вашу программу в двух режимах:
| Режим | Иконка | Горячие клавиши | Суть |
|---|---|---|---|
| Run (Обычный) | |
Shift+F10 (Win/Lin)Ctrl+R (Mac) |
Программа просто пробегает от начала до конца. |
| Debug (Отладка) | |
Shift+F9 (Win/Lin)Ctrl+D (Mac) |
Программа может останавливаться в указанных местах. |
В режиме отладки вы можете выполнять программу построчно (строка за строкой), наблюдая, как меняются значения переменных.
3. Точки остановки
Чтобы Debugger понял, где нужно остановиться, вы должны поставить Break Point. Без нее программа просто пролетит до конца, как обычно.
Давайте потренируемся на живом примере. Мы вынесли логику умножения в отдельный метод, чтобы показать всю мощь отладчика. Скопируйте этот код в IDEA:
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
int result = calculateMultiply(i); // <--- We want to stop here
sum += result;
System.out.println("Step: " + i + ", Result: " + result + ", Sum: " + sum);
}
System.out.println("Final Sum: " + sum);
}
public static int calculateMultiply(int number) {
return number * 2;
}
}
Задача. Мы хотим посмотреть, как меняются переменные внутри цикла и заглянуть внутрь нашего метода.
Действие. Кликните мышкой в узкую серую полоску слева от строки int result = calculateMultiply(i);. Появится красный кружок.
Теперь запустите программу через Debug (иконка жука). Программа запустится и мгновенно "замерзнет" перед выполнением этой строки.
4. Управление: F8, F7, F9
Когда программа стоит на паузе, у вас есть пульт управления в верхней части панели Debugger.
F8 — Шаг поверх (Step Over)
Нажмите F8. Программа выполнит текущую строку (вызовет метод, получит результат) и перейдет к следующей sum += result;.
Нажмите F8 еще раз. Программа сложит числа. Вы увидите, как значения переменных изменились.
Нажмите F8 еще раз. Вы увидите вывод в консоль.
Это основной способ перемещения: строка за строкой, не вдаваясь во внутренние детали методов.
F9 — Возобновить (Resume Program)
У нас цикл от 1 до 5. Нажимать F8 пять раз, чтобы пройти один круг цикла — долго. А если цикл на 1000 итераций?
Нажмите F9. Программа "отлипнет", выполнит весь остаток кода в текущей итерации, пойдет на второй круг и... снова остановится на Breakpoint.
Таким образом, с помощью F9 вы можете быстро прокручивать циклы: один нажим — одна итерация.
F7 — Шаг внутрь (Step Into)
Если в коде встретится вызов вашего метода (в нашем случае calculateMultiply(i)), и вы нажмете F8, Дебаггер просто выполнит его и пойдет дальше. Но если вы хотите увидеть, как работает код внутри этого метода — жмите F7.
Попробуйте нажать F7, когда программа остановится на строке int result = calculateMultiply(i);. Дебаггер перенесет вас внутрь метода calculateMultiply, и вы увидите, как значение передается в параметр number.
Shift + F8 — Шаг наружу (Step Out)
Что делать, если вы нажали F7 случайно на строке System.out.println(...) и попали в дебри системного кода Java? Читать тысячи строк чужого кода скучно и непонятно.
Жмите Shift + F8. Программа быстро выполнит всё, что осталось в текущем методе, и вернет вас обратно туда, откуда вы пришли (в ваш метод main).
5. Где смотреть значения?
Вернемся к нашему примеру с циклом.
Способ 1: Inline Debugging
Посмотрите прямо в редактор кода. Справа от строк серым цветом IDEA пишет текущие значения.
Способ 2: Панель Variables
Внизу в окне Debugger есть вкладка Variables. Там показаны все текущие переменные.
Важное уточнение для Java: Примитивные типы (например, int) показывают свое значение сразу. А вот объекты и массивы (например, String[]) хранят внутри себя много данных. Чтобы увидеть их содержимое, нужно кликнуть на маленькую стрелочку слева от переменной, чтобы "раскрыть" объект.
Способ 3: Панель Frames
Слева от переменных есть список, который называется Frames (Стек вызовов). Он показывает, на каком шаге сейчас находится программа.
Например, надпись main:6, Main означает:
- Вы находитесь в методе main класса Main.
- Вы остановились на строке номер 6.
Это ваш точный адрес в коде. Если вы провалитесь внутрь другого метода (нажмете F7 на calculateMultiply), в этом списке сверху появится новая запись calculateMultiply:13, Main, указывающая на то, что новый метод был вызван из предыдущего.
6. Evaluate Expression
Иногда просто смотреть на переменные мало. Вы хотите спросить: "А что будет, если..."
Нажмите Alt + F8 (Windows/Linux) или Option + F8 (macOS). Откроется окно "Evaluate". Также вы можете вводить выражения прямо в строку под панелью Variables»
Здесь вы можете написать любой код, используя текущие переменные. Например, в нашем цикле напишите:
sum + 100
Нажмите Enter и IDEA посчитает результат, не меняя реальную программу. Это ваш черновик для экспериментов.
7. Conditional Breakpoints
Представьте, что у вас цикл на 10 000 итераций, а ошибка происходит только на 5000-м шаге. Нажимать F9 пять тысяч раз — плохая идея.
Кликните правой кнопкой мыши по красному кружку Breakpoint. Появится всплывающее окно. В поле Condition напишите условие на Java, например: i == 5. Нажмите Done.
Теперь, если вы запустите Debugger, программа проигнорирует первые 4999 кругов и остановится только тогда, когда условие станет true. Это сэкономит вам часы работы!
8. Управление всеми точками остановки
Иногда новички ставят так много Breakpoints в разных файлах проекта, что программа потом постоянно останавливается в неожиданных местах. Искать красные кружки по всем файлам вручную — долго.
Нажмите Ctrl + Shift + F8 (Windows/Linux) или Cmd + Shift + F8 (macOS). Откроется окно Breakpoints.
Здесь вы видите список всех точек остановки в вашем проекте. Вы можете снять с них галочки (временно отключить) или удалить клавишей Delete.
9. Итоги
Мы рассмотрели основной арсенал Java-разработчика для поиска ошибок. Отладчик (Debugger) — это то, что превращает написание кода из "гадания на кофейной гуще" в точную инженерную работу.
Умение быстро находить причину ошибки — это навык, который ценится в коммерческой разработке даже выше, чем умение быстро писать код. Практикуйтесь с условными брейкпоинтами и Evaluation, и ни один баг от вас не скроется.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ