Всім привіт, JavaRush співтовариство. Сьогодні поговоримо про дебати: що це таке і як дебатити в Intellij IDEA. Стаття розрахована на людей, які мають вже мінімальні знання Java Core. Тут не буде ні фреймворків, ні складних процесів публікації бібліотек. Легка прогулянка. Тож розташовуйтеся зручніше – почнемо!
документації README файлу, який лежить в корені проекту, читаємо: очікувана поведінка - з усіх квіток, з яких збирають нектар (як double значення), буде зібрано кількість меду, що дорівнює половині зібраного нектару. У проекті є такі класи:
… написано, що нектар переходить у мед із пропорцією 2 до 1:
документація README файл містить помилку і його потрібно буде оновити. Обновимо README файл:
хабрі JavaRush :)
Чому Debug тобі необхідний
Давайте відразу прояснимо для себе: коду без багів не буває… Так влаштовано життя. Тому не варто одразу розкисати та кидати все, якщо код працює не так, як ми очікували. Але що робити? Звичайно, можна наставитиSystem.out.println
скрізь, де тільки можна і потім розгрібати висновок у терміналі, сподіваючись на те, що вийде знайти помилку. Все-таки можна ... і це роблять, і роблять акуратно за допомогою логування (можна почитати про це тут ). Але якщо є можливість запустити на локальній машині код, краще використовувати Debug . Відразу хочу зауважити, що в цій статті ми розглядатимемо дебаг проекту всередині Intellij IDEA. Якщо цікаво почитати про віддалений дебаг - ось, будь ласка, стаття з нашого ресурсу .
Що таке Debug
Debug — це процес налагодження (перевірки) коду, коли в процесі його виконання можна зупинитись у позначеному місці та подивитися за ходом виконання. Зрозуміти, у якому стані перебуває програма у певному місці. Це так само, якби можна було зупинити життя і подивитися на все збоку. Круто, правда? Наше завдання полягає в тому, щоб швидко і просто навчитися проводити налагодження додатків за допомогою всіх улюблених середовищ розробки Intellij IDEA.Що потрібно для початку налагодження
Даю безкоштовну пораду: доки читаєте статтю, робіть все те, що тут буде описано, благо є все для цього. Що потрібно:- Середовище розробки 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: Якраз наш випадок: є RuntimeException, додамо пошук такого виключення, як було описано вище, і запустимо main()
метод в дебаг режимі. Для цього натиснемо на зелену стрілку-трикутник в Intellij IDEA перед способом main()
: і отримаємо зупинену програму в останній момент перед тим, як спрацює виняток з таким значком Щоб отримати повну інформацію, необхідно подивитися в секцію Debug. У ній є Variables , де показані всі змінні, доступні в цій частині програми:
- nectar = 1.0;
- nectarCapacity = -1.0.
if ( nectar == 0 ) {
return 0;
}
Але проблема в тому, що перевіряє він не ту змінну ... і це помилка в коді. Замість того, щоб перевіряти значення нектару в квітці, що лежить у змінній nectarCapacity , програма перевіряє значення nectar , яке приходить у метод і є тією кількістю, яку хочуть взяти у нектару. Ось він, перший баг! Тому ставимо правильно і отримуємо вираз:
if ( nectarCapacity == 0) {
return 0;
}
Далі, запускаємо main()
метод у звичайному режимі (Run `Main.main()`)
і помилки більше немає, програма відпрацювала: Програма відпрацювала і видала відповідь: “33.0 honey was produced by 7 bees from 2 honey plants” Все було б добре, але відповідь неправильна ## 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: Ось цей момент розглянемо докладніше. Програма зупинилася перед виконанням 28-го рядка. У нижній частині бачимо Debug секцію, де описана вся інформація по запущеному додатку. У частині Variables, як уже було сказано, є всі змінні та об'єкти, які доступні з цієї частини програми. У частині Frames показані кроки, які проходить програму, можна подивитися на попередній крок та отримати всі локальні дані. Щоб програма продовжила роботу, можна натиснути F9 або зелену іконку, як показано нижче: Щоб зупинити програму , потрібно натиснути на червоний квадрат. клавіші:
- F8 - йти ділянкою коду і заходити у внутрішні методи;
- F7 - йти ділянкою коду і заходити у внутрішні методи.
beeHive.populateHoney()
, потрібно натиснути F7, і ми перейдемо далі: Далі, проходимо в режимі дебага використовуючи F8 за цим методом до кінця і опишемо, що відбувається в цьому методі:
- 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'ів. Офіційна документація
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ