Всем привет, JavaRush сообщество.
Сегодня поговорим о дебаге: что это такое и как дебажить в Intellij IDEA.
Статья рассчитана на людей, у которых есть уже минимальные знания Java Core. Здесь не будет ни фреймворков, ни сложных процессов публикации библиотек. Легкая прогулка. Так что располагайтесь поудобнее — начнем!
Но что же делать? Конечно, можно наставить
Debug — это процесс отладки (проверки) кода, когда в процессе его выполнения можно остановиться в обозначенном месте и посмотреть за ходом выполнения. Понять, в каком состоянии находится программа в определенном месте.
Это точно так же, как если бы можно было остановить жизнь и посмотреть на всё со стороны. Круто, правда?
Наша задача состоит в том, чтобы быстро и просто научиться проводить отладку приложений при помощи всеми нами любимой среды разработки Intellij IDEA.
Выбираем проект debug-presentation, нажимаем OK и получаем:
Оставляем import project from external sources, Maven и нажимаем Finish.
Импортировав проект, можем описать процесс на живом примере.
, который сделает все breakpoint’ы неактивными.
Чтобы посмотреть, какие уже выставленные breakpoint’ы, можно или зайти в Debug в левом нижнем углу и найти иконку
, или нажать Ctrl+Shift+F8:
Когда зайдем в список breakpoint’ов, увидим:
Здесь есть два preakpoint’a:
В появившемся окне пишем имя исключения, которое нужно добавить, выбираем из предложенного списка и нажимаем OK:
На этом ликбез заканчиваем и переходим к практике.
Так как я потомственный пчеловод, для презентации отладки создал проект, который описывает процесс сбора нектара пчелами, переработки нектара в мед и получение меда из улья.
На основе документации README файла, который лежит в корне проекта, читаем: ожидаемое поведение — со всех цветков, с которых собирают нектар (как double значение), будет собрано количество меда, равное половине собранного нектара.
В проекте есть такие классы:
Нужно посмотреть, что же там не так.
Из стек трейса в нижнем правом углу, можем увидеть, что в
Как раз наш случай: есть RuntimeException, добавим поиск такого исключения, как было описано выше, и запустим
и получим остановленную программу в момент перед тем, как сработает исключение с таким значком
![Debug в Intellij IDEA: гайд для новичков - 20]()
Чтоб получить полную информацию, нужно посмотреть в секцию Debug. В ней есть Variables, где показаны все переменные, доступные в этой части приложения:
Приложение отработало и выдало ответ:
“33.0 honey was produced by 7 bees from 2 honey plants”
Все бы хорошо, но ответ неправильный… Все потому, что в документации README файле написано, что нектар переходит в мед с пропорцией 2 к 1:
Вот этот момент рассмотрим подробнее. Программа остановилась перед выполнением 28-й строки.
В нижней части видим Debug секцию, в которой описана вся информация по запущенному приложению.
В части Variables, как уже было сказано, есть все переменные и объекты, которые доступны из этой части приложения.
В части Frames показаны шаги, которые проходит приложение, можно посмотреть на предыдущий шаг и получить все локальные данные.
Чтобы программа продолжила работу, можно нажать F9 или зеленую иконку, как показано ниже:
Чтобы остановить программу, нужно нажать на красный квадрат:
Чтобы перезапустить приложение в режиме дебага, нужно нажать на стрелку:
Далее, чтобы проходить пошагово по работе приложения, можно использовать две клавиши:
Далее, проходим в режиме дебага используя F8 по этому методу до конца и опишем, что происходит в этом методе:
документация README файл содержит ошибку, и его нужно будет обновить.
Обновим README файл:
хабре JavaRush :)

Почему Debug тебе необходим
Давайте сразу проясним для себя: кода без багов не бывает… Так устроена жизнь. Поэтому не стоит сразу раскисать и бросать все, если код работает не так, как мы ожидали.
System.out.println
везде, где только можно и потом разгребать вывод в терминале в надежде на то, что получится найти ошибку.
Все-таки можно… и это делают, и делают аккуратно при помощи логирования (можно почитать об этом здесь).
Но если есть возможность запустить на локальной машине код, лучше использовать Debug. Сразу хочу заметить, что в этой статье мы будем рассматривать дебаг проекта внутри Intellij IDEA. Если интересно почитать об удаленном дебаге — вот, пожалуйста, статья из нашего ресурса.
Что такое Debug

Что нужно для начала отладки
Даю бесплатный совет: пока читаете статью, проделывайте все то, что здесь будет описано, благо есть все для этого. Что нужно:- Среда разработки Intellij IDEA версии 2019.3.1 и выше. На случай, если у кого-то её нет, вот ссылка, где можно скачать. Скачивайте Community Edition, так как я буду использовать именно ее.
- Клонировать проект из GitHub и импортировать его через IDEA.


Немного теории… обещаю :D
Чтобы начать мало-мальски дебажить, нужно понять, что такое breakPoint и разобраться в нескольких горячих клавишах, которые нужны для начала. BreakPoint — это специальный маркер, который отображает место или состояние, на котором нужно остановить приложение. Поставить breakpoint можно либо нажав левой кнопкой мыши на левую боковую панель, либо кликнув курсором по месту кода и нажав Ctrl + F8. Breakpoint’ы бывают трех видов: метка на строку, метка на переменную и метка на метод. Выглядит это так:На строку:
если в выражении есть лямбда, то IDEA предлагает вам выбор — поставить на всю линию или конкретно в лямбда выражение:
На метод:
На класс




- Bee.java:24 — в классе Bee на 24-й строке
- Main.java:14 — в классе Main на 14-й строке


Поехали, будем врываться в дебри дебага

- Bee — обычная рабочая пчела;
- BeeQueen — пчелиная матка;
- BeeHive — улей;
- HoneyPlant — медонос, с которого собирают мед;
- Main — где находится
public static void main()
метод в котором стартует проект.
main()
, то окажется, что мало того, что не считается количество меда, так еще и выпадает ошибка…

HoneyPlant.java:20
, выбрасывается исключение RuntimeException:

main()
метод в дебаг режиме.
Для этого нажмем на зеленую стрелку-треугольник в Intellij IDEA перед методом main()
:



- nectar = 1.0;
- nectarCapacity = -1.0.
if ( nectar == 0 ) {
return 0;
}
Но загвоздка в том, что проверяет он не ту переменную… и это ошибка в коде. Вместо того, чтобы проверять значение нектара в цветке, который лежит в переменной nectarCapacity, программа проверяет значение nectar, которое приходит в метод и является тем количеством, которое хотят взять у нектара.
Вот же он, первый баг!
Поэтому ставим правильно и получаем выражение:
if ( nectarCapacity == 0) {
return 0;
}
Далее, запускаем main()
метод в обычном режиме (Run `Main.main()`)
и ошибки больше нет, программа отработала:

## Documentation
Presentation based on honey getting process.
**Note**: 1 honey point = 2 nectar points
Из главного метода видно, что есть два медоноса, по 30 и 40 единиц нектара соответственно, поэтому в итоге должно получиться 35 единиц мёда. А пишет, что 33. Куда же делись еще две единицы?... Сейчас узнаем!
Для этого нужно поставим breakpoint в методе Main.main()
на строке №28, где выполняется beeHive.populateHoney()
и запускаем main
метод в режиме Debug:




- F8 — идти по участку кода и не заходить во внутренние методы;
- F7 — идти по участку кода и заходить во внутренние методы.
beeHive.populateHoney()
, нужно нажать F7, и мы перейдем далее:

- 25-я строка — используется Stream API, чтобы собрать мед со всех пчел;
- 26-я строка — мед суммируется уже с существующим;
- 27-я строка — выделяется 2 единицы меда для матки;
- 28-я строка — эти две единицы удаляются из общего количества меда;
- 29-я строка — матка съедает этот мед.
## Documentation
Presentation based on honey getting process.
**Note**:
* 1 honey point = 2 nectar points
* 2 honey point queen bee eats every time when beehive populates the honey.
И все:, все найденные баги починены, можем спокойно продолжать с умным видом пить кофе и читать статейки на Подведем итог
За эту статью мы разобрались, что:- работы без ошибок не бывает и дебаг — это отличный способ их решить;
- что такое breakpoint и какой он бывает;
- как настроить exception breakpoint;
- как проводить навигацию в режиме дебага.
Статья для почитать
- Проект, что используется в статье
- IntelliJ IDEA и Debug: не дайвинг, но снорклинг
- Горькая правда о программировании...
- Официальная документация
- Типы breakpoint'ов. Официальна документация
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
подробнуюотсутствующую инструкцию, будто это что-то само собой разумеющееся.