JavaRush /Java блог /Java Developer /Debug в Intellij IDEA: гайд для новичков
Roman Beekeeper
35 уровень

Debug в Intellij IDEA: гайд для новичков

Статья из группы Java Developer
Всем привет, JavaRush сообщество. Сегодня поговорим о дебаге: что это такое и как дебажить в Intellij IDEA. Debug в Intellij IDEA: гайд для новичков - 1Статья рассчитана на людей, у которых есть уже минимальные знания Java Core. Здесь не будет ни фреймворков, ни сложных процессов публикации библиотек. Легкая прогулка. Так что располагайтесь поудобнее — начнем!

Почему Debug тебе необходим

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

Что такое Debug

Debug в Intellij IDEA: гайд для новичков - 3Debug — это процесс отладки (проверки) кода, когда в процессе его выполнения можно остановиться в обозначенном месте и посмотреть за ходом выполнения. Понять, в каком состоянии находится программа в определенном месте. Это точно так же, как если бы можно было остановить жизнь и посмотреть на всё со стороны. Круто, правда? Наша задача состоит в том, чтобы быстро и просто научиться проводить отладку приложений при помощи всеми нами любимой среды разработки Intellij IDEA.

Что нужно для начала отладки

Даю бесплатный совет: пока читаете статью, проделывайте все то, что здесь будет описано, благо есть все для этого. Что нужно:
  1. Среда разработки Intellij IDEA версии 2019.3.1 и выше. На случай, если у кого-то её нет, вот ссылка, где можно скачать. Скачивайте Community Edition, так как я буду использовать именно ее.
  2. Клонировать проект из GitHub и импортировать его через IDEA.
Открываем IDEA: Debug в Intellij IDEA: гайд для новичков - 4Выбираем проект debug-presentation, нажимаем OK и получаем: Debug в Intellij IDEA: гайд для новичков - 5Оставляем import project from external sources, Maven и нажимаем Finish. Импортировав проект, можем описать процесс на живом примере.

Немного теории… обещаю :D

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

    Debug в Intellij IDEA: гайд для новичков - 6

    если в выражении есть лямбда, то IDEA предлагает вам выбор — поставить на всю линию или конкретно в лямбда выражение:

    Debug в Intellij IDEA: гайд для новичков - 7
  • На метод:

    Debug в Intellij IDEA: гайд для новичков - 8
  • На класс

    Debug в Intellij IDEA: гайд для новичков - 9
Breakpoint’ы можно удалить, выполнив те же действия, что и при их добавлении. Бывают ситуации, когда нужно сделать их неактивными (замьютить). Для этого в Debug секции, можно найти значок Debug в Intellij IDEA: гайд для новичков - 10, который сделает все breakpoint’ы неактивными. Чтобы посмотреть, какие уже выставленные breakpoint’ы, можно или зайти в Debug в левом нижнем углу и найти иконку Debug в Intellij IDEA: гайд для новичков - 11, или нажать Ctrl+Shift+F8: Debug в Intellij IDEA: гайд для новичков - 12Когда зайдем в список breakpoint’ов, увидим: Debug в Intellij IDEA: гайд для новичков - 13Здесь есть два preakpoint’a:
  • Bee.java:24 — в классе Bee на 24-й строке
  • Main.java:14 — в классе Main на 14-й строке
Хочу заметить, что при клонировании проекта к себе не будет этих BreakPoint’ов: их нужно выставить самостоятельно! Также есть секция Java Exception Breakpoints. Очень полезная вещь. При помощи ее можно добавить неявный breakpoint, чтобы программа останавливалась перед выбрасыванием любого исключения или какого-то конкретного. Добавим для RuntimeException неявный breakpoint. Делается это легко: в верхнем левом углу есть плюсик “+”. Нажимаем на него и выбираем Java Exceptions Breakpoints: Debug в Intellij IDEA: гайд для новичков - 14В появившемся окне пишем имя исключения, которое нужно добавить, выбираем из предложенного списка и нажимаем OK: Debug в Intellij IDEA: гайд для новичков - 15На этом ликбез заканчиваем и переходим к практике.

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

Debug в Intellij IDEA: гайд для новичков - 16Так как я потомственный пчеловод, для презентации отладки создал проект, который описывает процесс сбора нектара пчелами, переработки нектара в мед и получение меда из улья. На основе документации README файла, который лежит в корне проекта, читаем: ожидаемое поведение — со всех цветков, с которых собирают нектар (как double значение), будет собрано количество меда, равное половине собранного нектара. В проекте есть такие классы:
  • Bee — обычная рабочая пчела;
  • BeeQueen — пчелиная матка;
  • BeeHive — улей;
  • HoneyPlant — медонос, с которого собирают мед;
  • Main — где находится public static void main() метод в котором стартует проект.
Если запустить метод main(), то окажется, что мало того, что не считается количество меда, так еще и выпадает ошибка… Debug в Intellij IDEA: гайд для новичков - 17Нужно посмотреть, что же там не так. Из стек трейса в нижнем правом углу, можем увидеть, что в HoneyPlant.java:20, выбрасывается исключение RuntimeException: Debug в Intellij IDEA: гайд для новичков - 18Как раз наш случай: есть RuntimeException, добавим поиск такого исключения, как было описано выше, и запустим main() метод в дебаг режиме. Для этого нажмем на зеленую стрелку-треугольник в Intellij IDEA перед методом main(): Debug в Intellij IDEA: гайд для новичков - 19и получим остановленную программу в момент перед тем, как сработает исключение с таким значком Debug в Intellij IDEA: гайд для новичков - 20Debug в Intellij IDEA: гайд для новичков - 21Чтоб получить полную информацию, нужно посмотреть в секцию Debug. В ней есть Variables, где показаны все переменные, доступные в этой части приложения:
  • nectar = 1.0;
  • nectarCapacity = -1.0.
Исключение выбрасывается справедливо, так как значение количества нектара, которое есть в медоносе, не может быть отрицательным. Но почему же так происходит? Ведь есть же проверка, что если нектар закончился, то возвращается нулевое значение в строках 15-17:

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

    if ( nectarCapacity == 0) {
         return 0;
}
Далее, запускаем main() метод в обычном режиме (Run `Main.main()`) и ошибки больше нет, программа отработала: Debug в Intellij IDEA: гайд для новичков - 22Приложение отработало и выдало ответ: “33.0 honey was produced by 7 bees from 2 honey plants” Все бы хорошо, но ответ неправильный… Все потому, что в документации README файле написано, что нектар переходит в мед с пропорцией 2 к 1:

## 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: Debug в Intellij IDEA: гайд для новичков - 23Вот этот момент рассмотрим подробнее. Программа остановилась перед выполнением 28-й строки. В нижней части видим Debug секцию, в которой описана вся информация по запущенному приложению. В части Variables, как уже было сказано, есть все переменные и объекты, которые доступны из этой части приложения. В части Frames показаны шаги, которые проходит приложение, можно посмотреть на предыдущий шаг и получить все локальные данные. Чтобы программа продолжила работу, можно нажать F9 или зеленую иконку, как показано ниже: Debug в Intellij IDEA: гайд для новичков - 24Чтобы остановить программу, нужно нажать на красный квадрат: Debug в Intellij IDEA: гайд для новичков - 25Чтобы перезапустить приложение в режиме дебага, нужно нажать на стрелку: Debug в Intellij IDEA: гайд для новичков - 26Далее, чтобы проходить пошагово по работе приложения, можно использовать две клавиши:
  • F8 — идти по участку кода и не заходить во внутренние методы;
  • F7 — идти по участку кода и заходить во внутренние методы.
Поэтому нам, чтобы зайти в работу метода beeHive.populateHoney(), нужно нажать F7, и мы перейдем далее: Debug в Intellij IDEA: гайд для новичков - 27Далее, проходим в режиме дебага используя F8 по этому методу до конца и опишем, что происходит в этом методе:
  • 25-я строка — используется Stream API, чтобы собрать мед со всех пчел;
  • 26-я строка — мед суммируется уже с существующим;
  • 27-я строка — выделяется 2 единицы меда для матки;
  • 28-я строка — эти две единицы удаляются из общего количества меда;
  • 29-я строка — матка съедает этот мед.
Вот куда делись эти две единицы, ура! После общения с бизнес-аналитиком приходим к выводу, что документация README файл содержит ошибку, и его нужно будет обновить. Обновим README файл:

## 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.
И все:, все найденные баги починены, можем спокойно продолжать с умным видом пить кофе и читать статейки на хабре JavaRush :)

Подведем итог

За эту статью мы разобрались, что:
  • работы без ошибок не бывает и дебаг — это отличный способ их решить;
  • что такое breakpoint и какой он бывает;
  • как настроить exception breakpoint;
  • как проводить навигацию в режиме дебага.

Статья для почитать

Смотрите также мои другие статьи:
Комментарии (286)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
improvement Уровень 7
8 июня 2024
2024 год. Если вы не понимаете как сделать инпорт проекта, Если у вас включен режим новичка у плагина JavaRush, то нужно его выключить. 1. Нужно скачать проект с гитхаба. Для этого нужно перейти по ссылке и кликнуть по зеленой кнопке <> Code и выбрать из всплывающего окна Download ZIP. У вас скачается архив. Его нужно распаковать. У вас появится папка. Вам нужно скопировать путь к этой папке (в Windows 11 удалите из скопированного текста ковычки в начале и конце пути) 2. Зайти в IntellijIDEA (у меня версия 2024.1.2) 3. Нажать в левом верхнем углу три полоски (или Alt + \) 4. Нажать File 5. Нажать New 6. Выбрать Project from Existing Sourses... (Перевод: Выбрать проект из существующих источников...) 7. Вставить путь к папке, который мы скопировали в 1 пункте 8. Выбрать Import project from external model 9. Выбрать Maven 10. Нажать Create и подождать пока проект загрузится средой разаработки. Внизу среды разработки будет заполняющаяся полоска, когда она пропадет, то можете приступать к тому, что пишет автор этой статьи. П.С. Надеюсь мне тоже кто-нибудь из вас поможет, когда я буду в этом нуждаться.
Stray Уровень 11
30 мая 2024
Всем привет! Приглашаю на мой тг канал "Путь к Java: Дневник разработчика"! На канале вы найдете: - Мои ежедневные отчеты о прогрессе в обучении - Разбор непонятных моментов по лекциям и задачам JavaRush - Полезные материалы по Java - Есть чат, где вы можете делиться друг с другом своим прогрессом, а также обсуждать любые вопросы, касательно обучения и не только. Канал был создан недавно, но я уверен, что мы быстро сформируем сообщество единомышленников и будем приятно и с пользой проводить время. Присоединяйтесь! Путь к Java: Дневник разработчика
safe Уровень 26
29 апреля 2024
ахаха сколько же я времени потратил на скрине с брейкпоинтами в попытках найти их в проекте, пока не прочитал ниже что их надо самому добавить. ну точно час + 4 импортирования проекта, за это время можно было всю лекцию прочитать. но придётся на завтра отложить. всегда так делай автор 👍. for (int bug = 0; bug < 2; bug++) { if ( bug != 0) { Когда зайдем в список breakpoint’ов, увидим: Debug в Intellij IDEA: гайд для новичков - 13Здесь есть два preakpoint’a: Bee.java:24 — в классе Bee на 24-й строке Main.java:14 — в классе Main на 14-й строке } else { Хочу заметить, что при клонировании проекта к себе не будет этих BreakPoint’ов: их нужно выставить самостоятельно! } }
11 апреля 2024
Разработчики пяткой в грудь себя бьют, что сосредоточены только на этом проекте. Постоянно совершенствуя статьи. И уже не в первый раз встречаются моменты, которые ученик 5го уровня ну никак знать не может. "если в выражении есть лямбда, то IDEA предлагает вам выбор — поставить на всю линию или конкретно в лямбда выражение:" - лямбда выражение для примера дебага. Неужели нельзя было обойтись без нее? В циклах тоже часто подобное проскакивало(к примеру return, который еще не объясняли). п.с. я разраб со стажем. Я знаю, что такое лямбда выражение и retrun - но неужели не понятно, что подобное запутывает новичков? У них от циклов мозг пухнет от кол-ва информации. А вы еще больше путаницу вносите. Так сложно сделать примеры на основе только того, что прошел ученик. "Клонировать проект из GitHub и импортировать его через IDEA." - автор молодец, написал клонируйте проект...а как, куда нажимать, куда что вставлять...Да сам разберется... Автор лучше больше не пиши статьи, если не понимаешь как их писать для людей, которые неделю назад увидели Hello world. п.с. пишу без негатива, только критика по факту.
SashaCurry Уровень 17
29 марта 2024
Отличное задание, спасибо! Не люблю копаться в чужом коде, но без этого на работе никуда, поэтому решил всё-таки подробнее остановиться на этом примере и всерьёз рассмотреть его После рассмотрения нашёл ещё одну ошибку: "...25-я строка — используется Stream API, чтобы собрать мёд со всех пчел; 26-я строка — мед суммируется уже с существующим;..." 25-я строка - используется Stream API, чтобы собрать нектар со всех пчёл; 26-я строка - из нектара создаётся мёд и суммируется уже с существующим. P.s. прощу прощения за душноту, просто раз уж мы тут собрались искать баги, то стоит учесть этот момент в статье)
Lucky Уровень 8
25 марта 2024
Привет всем! Как клонировать проект из GitHub?
daniil dudko Уровень 16
15 марта 2024
Здравствуйте. Клонировать проект из GitHub ?
Ика Уровень 33
12 марта 2024
Ох уж эти прекрасные скрины в прекрасном разрешении. А нет Нормальных? Немного методом тыка пришлось работать.
A.Field Уровень 13
24 февраля 2024
Возникла проблема, выводит вместо 33, 68
White_Eagle Уровень 11
19 февраля 2024
Только начал разбираться. Может кому и поможет. Временно отключил плагин Javarush!