1. Bug
Programiści mają swój własny slang. Pierwszym słowem, z którym zetkniesz się blisko, będzie bug (z ang. bug — robak). Słowo to oznacza błąd w programie, przez który robi on coś nie tak, crashuje się lub zwraca dziwny wynik.
Jeśli program działa dziwnie, ale programista zapewnia, że tak miało być, zwykle mówi się: "To nie bug, to feature". Internet jest pełen memów na ten temat.
Rys historyczny
Legenda głosi, że we wrześniu 1947 roku naukowcy z Harvardu testowali komputer Mark II. Szwankował. Sprawdzając wszystkie styki, znaleźli prawdziwą ćmę uwięzioną między przekaźnikami. Owada wklejono do dziennika z podpisem "First actual case of bug being found" (Pierwszy rzeczywisty przypadek znalezienia robaka).
Od tego czasu proces wyszukiwania i usuwania błędów nazywa się debugowaniem lub po prostu odpluskwianiem.

2. Debug Mode
Aby znaleźć błąd, programiści używają Debuggera. To specjalne narzędzie wewnątrz IntelliJ IDEA, które pozwala wstrzymać wykonywanie programu i zajrzeć mu "pod maskę".
IntelliJ IDEA może uruchomić Twój program w dwóch trybach:
| Tryb | Ikona | Skróty klawiszowe | Istota |
|---|---|---|---|
| Run (Zwykły) | |
Shift+F10 (Win/Lin)Ctrl+R (Mac) |
Program po prostu przebiega od początku do końca. |
| Debug (Debugowanie) | |
Shift+F9 (Win/Lin)Ctrl+D (Mac) |
Program może się zatrzymywać we wskazanych miejscach. |
W trybie debugowania możesz wykonywać program linijka po linijce, obserwując, jak zmieniają się wartości zmiennych.
3. Punkty wstrzymania (Breakpoints)
Aby Debugger zrozumiał, gdzie ma się zatrzymać, musisz postawić Breakpoint. Bez niego program po prostu przeleci do końca, jak zwykle.
Poćwiczmy na żywym przykładzie. Przenieśliśmy logikę mnożenia do osobnej metody, aby pokazać całą moc debuggera. Skopiuj ten kod do IDEA:
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
int result = calculateMultiply(i); // <--- Chcemy zatrzymać się tutaj
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;
}
}
Zadanie. Chcemy zobaczyć, jak zmieniają się zmienne wewnątrz pętli i zajrzeć do wnętrza naszej metody.
Akcja. Kliknij myszką w wąski szary pasek po lewej stronie od linii int result = calculateMultiply(i);. Pojawi się czerwone kółko.
Teraz uruchom program przez Debug (ikona robaka). Program uruchomi się i natychmiast "zamarznie" przed wykonaniem tej linii.
4. Sterowanie: F8, F7, F9
Gdy program jest na pauzie, masz do dyspozycji panel sterowania w górnej części okna Debuggera.
F8 — Krok nad (Step Over)
Naciśnij F8. Program wykona bieżącą linię (wywoła metodę, pobierze wynik) i przejdzie do następnej sum += result;.
Naciśnij F8 ponownie. Program doda liczby. Zobaczysz, jak zmieniły się wartości zmiennych.
Naciśnij F8 jeszcze raz. Zobaczysz wyjście w konsoli.
To podstawowy sposób poruszania się: linijka po linijce, bez wchodzenia w wewnętrzne szczegóły metod.
F9 — Wznów (Resume Program)
Mamy pętlę od 1 do 5. Naciskanie F8 pięć razy, aby przejść jedno okrążenie pętli, jest czasochłonne. A co jeśli pętla ma 1000 iteracji?
Naciśnij F9. Program "odmrozi się", wykona całą resztę kodu w bieżącej iteracji, przejdzie do drugiego okrążenia i... znowu zatrzyma się na Breakpoincie.
W ten sposób, za pomocą F9 możesz szybko przewijać pętle: jedno naciśnięcie — jedna iteracja.
F7 — Krok do środka (Step Into)
Jeśli w kodzie wystąpi wywołanie Twojej metody (w naszym przypadku calculateMultiply(i)) i naciśniesz F8, Debugger po prostu ją wykona i pójdzie dalej. Ale jeśli chcesz zobaczyć, jak działa kod wewnątrz tej metody — naciśnij F7.
Spróbuj nacisnąć F7, gdy program zatrzyma się na linii int result = calculateMultiply(i);. Debugger przeniesie Cię do wnętrza metody calculateMultiply, a Ty zobaczysz, jak wartość jest przekazywana do parametru number.
Shift + F8 — Krok na zewnątrz (Step Out)
Co zrobić, jeśli przypadkowo nacisnąłeś F7 na linii System.out.println(...) i trafiłeś w gąszcz kodu systemowego Javy? Czytanie tysięcy linii cudzego kodu jest nudne i niezrozumiałe.
Naciśnij Shift + F8. Program szybko wykona wszystko, co pozostało w bieżącej metodzie, i zwróci Cię z powrotem tam, skąd przyszedłeś (do Twojej metody main).
5. Gdzie podglądać wartości?
Wróćmy do naszego przykładu z pętlą.
Sposób 1: Inline Debugging
Spójrz bezpośrednio w edytor kodu. Po prawej stronie od linii na szaro IDEA wypisuje bieżące wartości.
Sposób 2: Panel Variables
Na dole w oknie Debuggera znajduje się zakładka Variables. Tam pokazane są wszystkie bieżące zmienne.
Ważna uwaga dla Javy: Typy proste (np. int) pokazują swoją wartość od razu. Z kolei obiekty i tablice (np. String[]) przechowują w sobie wiele danych. Aby zobaczyć ich zawartość, należy kliknąć na małą strzałkę po lewej stronie od zmiennej, aby "rozwinąć" obiekt.
Sposób 3: Panel Frames
Po lewej stronie od zmiennych znajduje się lista nazywająca się Frames (Stos wywołań). Pokazuje ona, na jakim etapie znajduje się obecnie program.
Na przykład wpis main:6, Main oznacza:
- Znajdujesz się w metodzie main klasy Main.
- Zatrzymałeś się na linii numer 6.
To Twój dokładny adres w kodzie. Jeśli wpadniesz do innej metody (naciśniesz F7 na calculateMultiply), na tej liście na górze pojawi się nowy wpis calculateMultiply:13, Main, wskazujący, że nowa metoda została wywołana z poprzedniej.
6. Evaluate Expression
Czasami samo patrzenie na zmienne to za mało. Chcesz zapytać: "A co będzie, jeśli..."
Naciśnij Alt + F8 (Windows/Linux) lub Option + F8 (macOS). Otworzy się okno "Evaluate". Możesz też wpisywać wyrażenia bezpośrednio w pole pod panelem Variables.
Tutaj możesz napisać dowolny kod, korzystając z bieżących zmiennych. Na przykład w naszej pętli wpisz:
sum + 100
Naciśnij Enter, a IDEA policzy wynik bez zmieniania prawdziwego programu. To Twój brudnopis do eksperymentów.
7. Conditional Breakpoints
Wyobraź sobie, że masz pętlę na 10 000 iteracji, a błąd występuje tylko na 5000. kroku. Naciskanie F9 pięć tysięcy razy to zły pomysł.
Kliknij prawym przyciskiem myszy na czerwone kółko Breakpointu. Pojawi się wyskakujące okienko. W polu Condition napisz warunek w Javie, na przykład: i == 5. Naciśnij Done.
Teraz, jeśli uruchomisz Debuggera, program zignoruje pierwsze 4999 okrążeń i zatrzyma się dopiero wtedy, gdy warunek stanie się true. To zaoszczędzi Ci godziny pracy!
8. Zarządzanie wszystkimi punktami wstrzymania
Czasami początkujący stawiają tak dużo Breakpoints w różnych plikach projektu, że program potem stale zatrzymuje się w nieoczekiwanych miejscach. Szukanie czerwonych kółek po wszystkich plikach ręcznie zajmuje dużo czasu.
Naciśnij Ctrl + Shift + F8 (Windows/Linux) lub Cmd + Shift + F8 (macOS). Otworzy się okno Breakpoints.
Tutaj widzisz listę wszystkich punktów wstrzymania w Twoim projekcie. Możesz odznaczyć je (tymczasowo wyłączyć) lub usunąć klawiszem Delete.
9. Podsumowanie
Omówiliśmy podstawowy arsenał programisty Javy do wyszukiwania błędów. Debugger to narzędzie, które zamienia pisanie kodu z "wróżenia z fusów" w precyzyjną pracę inżynierską.
Umiejętność szybkiego znajdowania przyczyny błędu to umiejętność ceniona w komercyjnym Developmentie nawet bardziej niż umiejętność szybkiego pisania kodu. Ćwicz z warunkowymi breakpointami i Ewaluacją, a żaden bug się przed Tobą nie ukryje.
GO TO FULL VERSION