CodeGym /Cursos /JAVA 25 SELF /Debug no IntelliJ IDEA

Debug no IntelliJ IDEA

JAVA 25 SELF
Nível 14 , Lição 6
Disponível

1. Bug

Os programadores têm o seu próprio jargão. E a primeira palavra que você conhecerá a fundo será bug (do inglês bug — inseto). Esta palavra designa um erro no programa que faz com que ele se comporte de forma inesperada, trave ou produza um resultado estranho.

Se um programa funciona de maneira estranha, mas o programador garante que foi planejado assim, geralmente diz-se: "Isso não é um bug, é uma feature". A internet está cheia de memes sobre esse tema.

Meme sobre bug e feature

Contexto histórico

Diz a lenda que, em setembro de 1947, cientistas de Harvard estavam testando o computador Mark II. Ele apresentava falhas. Ao verificar todos os contatos, encontraram uma mariposa real presa entre os relés. O inseto foi colado no registro com a legenda "First actual case of bug being found" (Primeiro caso real de um inseto encontrado).

Desde então, o processo de busca e correção de erros é chamado de debug ou depuração.

Foto do primeiro bug no registro


2. Modo de Debug

Para encontrar um erro, os programadores usam o Debugger. É uma ferramenta especial dentro do IntelliJ IDEA que permite colocar a execução do programa em pausa e dar uma olhada "debaixo do capô".

O IntelliJ IDEA pode executar seu programa em dois modos:

Modo Ícone Atalhos O que faz
Run (Normal) Ícone de Play Shift+F10 (Win/Lin)
Ctrl+R (Mac)
O programa simplesmente executa do início ao fim.
Debug (Depuração) Ícone de Inseto Shift+F9 (Win/Lin)
Ctrl+D (Mac)
O programa pode parar em locais especificados.

No modo de depuração, você pode executar o programa linha por linha, observando como os valores das variáveis mudam.

3. Breakpoints

Para que o Debugger entenda onde parar, você deve colocar um Breakpoint. Sem ele, o programa simplesmente passará direto até o fim, como de costume.

Vamos praticar com um exemplo prático. Extraímos a lógica da multiplicação para um método separado para mostrar todo o poder do debugger. Copie este código para o seu IDEA:

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 5; i++) {
            int result = calculateMultiply(i);  // <--- Queremos parar aqui
            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;
    }
}

Tarefa. Queremos ver como as variáveis mudam dentro do loop e entrar dentro do nosso método.

Ação. Clique com o mouse na margem cinza estreita à esquerda da linha int result = calculateMultiply(i);. Um círculo vermelho aparecerá.

Editor do IDEA mostrando código Java com um Breakpoint vermelho

Agora, inicie o programa através do Debug (ícone do inseto). O programa iniciará e "congelará" instantaneamente antes de executar essa linha.

Debugger do IDEA suspenso no breakpoint, mostrando a linha de execução destacada

4. Controle: F8, F7, F9

Quando o programa está em pausa, você tem um painel de controle na parte superior da janela Debugger.

Barra de ferramentas do Debugger com os botões Step Over, Step Into, Resume destacados

F8 — Step Over

Pressione F8. O programa executará a linha atual (chamará o método, obterá o resultado) e avançará para a próxima sum += result;.

Execução movida para sum += result; valores inline visíveis]

Pressione F8 novamente. O programa somará os números. Você verá como os valores das variáveis mudaram.

Variáveis sum e result atualizadas no painel Variables

Pressione F8 mais uma vez. Você verá a saída no console.

Saída do console mostrando Step 1]

Esta é a principal forma de se mover: linha por linha, sem se aprofundar nos detalhes internos dos métodos.

F9 — Resume Program

Temos um loop de 1 a 5. Pressionar F8 cinco vezes para passar por uma rodada do loop é entediante. E se o loop tiver 1000 iterações?

Pressione F9. O programa "desgrudará", executará todo o restante do código na iteração atual, seguirá para a segunda rodada e... parará novamente no Breakpoint.

Pressionar F9 pula para a próxima iteração do loop, i=2

Assim, com a ajuda do F9, você pode percorrer loops rapidamente: um clique — uma iteração.

Variáveis mostrando valores para a segunda iteração]

F7 — Step Into

Se no código você encontrar uma chamada de um método seu (no nosso caso calculateMultiply(i)) e pressionar F8, o Debugger simplesmente o executará e seguirá em frente. Mas se você quiser ver como o código funciona dentro desse método — pressione F7.

Tente pressionar F7 quando o programa parar na linha int result = calculateMultiply(i);. O Debugger o levará para dentro do método calculateMultiply, e você verá como o valor é passado para o parâmetro number.

Entrando no método calculateMultiply(int number)

Shift + F8 — Step Out

O que fazer se você pressionou F7 por acidente na linha System.out.println(...) e caiu nas profundezas do código de sistema do Java? Ler milhares de linhas de código alheio é chato e confuso.

Pressione Shift + F8. O programa executará rapidamente tudo o que resta no método atual e o trará de volta para onde você veio (o seu método main).

Saindo do método PrintStream/System.out de volta ao Main

5. Onde ver os valores?

Voltemos ao nosso exemplo com o loop.

Visão geral da janela do Debugger mostrando as abas Variables e Frames

Modo 1: Inline Debugging

Observe diretamente no editor de código. À direita das linhas, o IDEA escreve os valores atuais em cinza.

Modo 2: Painel Variables

Na parte inferior da janela Debugger, existe a aba Variables. Lá são mostradas todas as variáveis atuais.

Esclarecimento importante para Java: Tipos primitivos (por exemplo, int) mostram seus valores imediatamente. Já objetos e arrays (por exemplo, String[]) armazenam muitos dados dentro de si. Para ver o conteúdo, é necessário clicar na pequena seta à esquerda da variável para "expandir" o objeto.

Modo 3: Painel Frames

À esquerda das variáveis há uma lista chamada Frames (Stack Trace). Ela mostra em que passo o programa se encontra atualmente.

Por exemplo, o texto main:6, Main significa:

  • Você está no método main da classe Main.
  • Você parou na linha número 6.

Este é o seu endereço exato no código. Se você entrar em outro método (pressionar F7 em calculateMultiply), uma nova entrada aparecerá no topo desta lista: calculateMultiply:13, Main, indicando que o novo método foi chamado a partir do anterior.

6. Evaluate Expression

Às vezes, apenas olhar para as variáveis não é suficiente. Você quer perguntar: "O que acontece se..."

Pressione Alt + F8 (Windows/Linux) ou Option + F8 (macOS). Uma janela "Evaluate" será aberta. Você também pode digitar expressões diretamente na linha abaixo do painel Variables.

Aqui você pode escrever qualquer código usando as variáveis atuais. Por exemplo, em nosso loop, escreva:

sum + 100

Pressione Enter e o IDEA calculará o resultado sem alterar o programa real. É o seu rascunho para experimentos.

Diálogo Evaluate Expression mostrando sum + 100 com o resultado avaliado

7. Conditional Breakpoints

Imagine que você tem um loop de 10.000 iterações, mas o erro ocorre apenas no passo 5.000. Pressionar F9 cinco mil vezes é uma má ideia.

Clique com o botão direito do mouse no círculo vermelho do Breakpoint. Uma janela pop-up aparecerá. No campo Condition, escreva uma condição em Java, por exemplo: i == 5. Pressione Done.

Clique com o botão direito em um Breakpoint mostrando o campo Condition com i == 5 inserido

Agora, se você iniciar o Debugger, o programa ignorará as primeiras 4.999 rodadas e parará apenas quando a condição se tornar true. Isso economizará horas de trabalho!

8. Gerenciamento de todos os Breakpoints

Às vezes, iniciantes colocam tantos Breakpoints em diferentes arquivos do projeto que o programa fica constantemente parando em lugares inesperados. Procurar círculos vermelhos por todos os arquivos manualmente é demorado.

Pressione Ctrl + Shift + F8 (Windows/Linux) ou Cmd + Shift + F8 (macOS). A janela Breakpoints será aberta.

Janela Breakpoints (Ctrl+Shift+F8) mostrando uma lista de todos os breakpoints ativos com caixas de seleção

Aqui você vê uma lista de todos os pontos de parada no seu projeto. Você pode desmarcá-los (desabilitar temporariamente) ou excluí-los com a tecla Delete.

9. Conclusão

Analisamos o arsenal principal do desenvolvedor Java para encontrar erros. O Debugger é o que transforma a escrita de código de "adivinhação" em um trabalho de engenharia preciso.

A habilidade de encontrar rapidamente a causa de um erro é uma competência que é valorizada no desenvolvimento comercial, até mais do que a habilidade de escrever código rapidamente. Pratique com breakpoints condicionais e Evaluation, e nenhum bug escapará de você.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION