JavaRush /Курси /JAVA 25 SELF /Debug в IntelliJ IDEA

Debug в IntelliJ IDEA

JAVA 25 SELF
Рівень 14 , Лекція 6
Відкрита

1. Bug

У програмістів є свій сленг. І першим словом, з яким ви познайомитеся тісно, буде баг (від англ. bug — жук). Це слово позначає помилку в програмі, через яку вона робить щось не те, падає або видає дивний результат.

Якщо програма працює дивно, але програміст запевняє, що так і було задумано, зазвичай кажуть: «Це не баг, це фіча». Інтернет повний мемів на цю тему.

Мем про баг та фічу

Історична довідка

Легенда свідчить, що у вересні 1947 року вчені Гарварду тестували комп'ютер Mark II. Він давав збої. Перевіривши всі контакти, вони знайшли справжнього метелика, що застряг між реле. Комаху вклеїли в журнал з підписом «First actual case of bug being found» (Перший реальний випадок знайденого жука).

З того часу процес пошуку та усунення помилок називають дебаг (debug) або налагодження.

Фото першого бага в журналі


2. Debug Mode

Щоб знайти помилку, програмісти використовують Debugger (відлагоджувач). Це спеціальний інструмент всередині IntelliJ IDEA, який дозволяє поставити виконання програми на паузу і зазирнути їй «під капот».

IntelliJ IDEA може запустити вашу програму у двох режимах:

Режим Іконка Гарячі клавіші Суть
Run (Звичайний) Іконка Play Shift+F10 (Win/Lin)
Cmd+R (Mac)
Програма просто пробігає від початку до кінця.
Debug (Налагодження) Іконка Жука Shift+F9 (Win/Lin)
Cmd+D (Mac)
Програма може зупинятися у вказаних місцях.

У режимі налагодження ви можете виконувати програму порядково (рядок за рядком), спостерігаючи, як змінюються значення змінних.

3. Точки зупинки (Breakpoints)

Щоб 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);  // <--- Ми хочемо зупинитися тут
            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);. З'явиться червоний кружечок.

IDEA Editor showing Java code with a red Breakpoint

Тепер запустіть програму через Debug (іконка жука). Програма запуститься і миттєво «замерзне» перед виконанням цього рядка.

IDEA Debugger suspended at the breakpoint, showing highlighted execution line

4. Керування: F8, F7, F9

Коли програма стоїть на паузі, у вас є пульт керування у верхній частині панелі Debugger.

Debugger toolbar with Step Over, Step Into, Resume buttons highlighted

F8 — Крок поверх (Step Over)

Натисніть F8. Програма виконає поточний рядок (викличе метод, отримає результат) і перейде до наступного sum += result;.

Execution moved to sum += result; inline values visible

Натисніть F8 ще раз. Програма додасть числа. Ви побачите, як значення змінних змінилися.

Variables sum and result updated in the Variables pane

Натисніть F8 ще раз. Ви побачите вивід у консоль.

Console output showing Step 1

Це основний спосіб переміщення: рядок за рядком, не вдаючись у внутрішні деталі методів.

F9 — Відновити (Resume Program)

У нас цикл від 1 до 5. Натискати F8 п'ять разів, щоб пройти одне коло циклу — довго. А якщо цикл на 1000 ітерацій?

Натисніть F9. Програма «відлипне», виконає всю решту коду в поточній ітерації, піде на друге коло і... знову зупиниться на Breakpoint.

Pressing F9 jumps to the next iteration of the loop, i=2

Таким чином, за допомогою F9 ви можете швидко прокручувати цикли: одне натискання — одна ітерація.

Variables showing values for the second iteration

F7 — Крок всередину (Step Into)

Якщо в коді зустрінеться виклик вашого методу (в нашому випадку calculateMultiply(i)), і ви натиснете F8, Дебагер просто виконає його і піде далі. Але якщо ви хочете побачити, як працює код всередині цього методу — тисніть F7.

Спробуйте натиснути F7, коли програма зупиниться на рядку int result = calculateMultiply(i);. Дебагер перенесе вас всередину методу calculateMultiply, і ви побачите, як значення передається в параметр number.

Stepping into calculateMultiply(int number) method

Shift + F8 — Крок назовні (Step Out)

Що робити, якщо ви натиснули F7 випадково на рядку System.out.println(...) і потрапили в нетрі системного коду Java? Читати тисячі рядків чужого коду нудно і незрозуміло.

Тисніть Shift + F8. Програма швидко виконає все, що залишилося в поточному методі, і поверне вас назад туди, звідки ви прийшли (у ваш метод main).

Stepping out of PrintStream/System.out method back to Main

5. Де дивитися значення?

Повернемося до нашого прикладу з циклом.

Debugger window overview showing Variables and Frames tabs

Спосіб 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 порахує результат, не змінюючи реальну програму. Це ваша чернетка для експериментів.

Evaluate Expression dialog showing sum + 100 with the evaluated result

7. Conditional Breakpoints

Уявіть, що у вас цикл на 10 000 ітерацій, а помилка стається лише на 5000-му кроці. Натискати F9 п'ять тисяч разів — погана ідея.

Клікніть правою кнопкою миші по червоному кружечку Breakpoint. З'явиться спливне вікно. У полі Condition напишіть умову на Java, наприклад: i == 5. Натисніть Done.

Right-click on a Breakpoint showing the Condition field with i == 5 entered

Тепер, якщо ви запустите Debugger, програма проігнорує перші 4999 кіл і зупиниться тільки тоді, коли умова стане true. Це заощадить вам години роботи!

8. Керування всіма точками зупинки

Іноді новачки ставлять так багато Breakpoints у різних файлах проєкту, що програма потім постійно зупиняється в несподіваних місцях. Шукати червоні кружечки по всіх файлах вручну — довго.

Натисніть Ctrl + Shift + F8 (Windows/Linux) або Cmd + Shift + F8 (macOS). Відкриється вікно Breakpoints.

Breakpoints window (Ctrl+Shift+F8) showing a list of all active breakpoints with checkboxes

Тут ви бачите список усіх точок зупинки у вашому проєкті. Ви можете зняти з них галочки (тимчасово вимкнути) або видалити клавішею Delete.

9. Підсумки

Ми розглянули основний арсенал Java-розробника для пошуку помилок. Відлагоджувач (Debugger) — це те, що перетворює написання коду з «ворожіння на кавовій гущі» в точну інженерну роботу.

Вміння швидко знаходити причину помилки — це навичка, яка цінується в комерційній розробці навіть вище, ніж уміння швидко писати код. Практикуйтеся з умовними брейкпоінтами та Evaluation, і жоден баг від вас не сховається.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ