Depuração de código Java: de "por que não funciona?" até "eu controlo o processo"
\n\nTodo desenvolvedor Java conhece este sentimento: você inicia a aplicação, ela falha com NullPointerException, e o stack trace leva a lugar nenhum. Ou, pior ainda, o código funciona, mas produz resultados completamente diferentes do esperado. Familiar? Bem-vindo ao mundo da depuração. Não é apenas encontrar bugs — é a arte de entender o que seu programa realmente faz.
Neste artigo, vamos explorar como depurar código Java como um profissional. Você aprenderá técnicas avançadas que economizarão horas de frustração e ferramentas que transformarão a depuração de uma rotina em um detetive fascinante. Vamos lá!
\n\n1. Base: Breakpoint — seu melhor amigo
\n\nVamos começar pelo mais óbvio: pontos de parada. Mas não pule — você ficará surpreso com quantos desenvolvedores usam apenas 10% de suas capacidades.
\n\n1.1. Breakpoints lineares, condicionais e de exceção
\n\nNo IntelliJ IDEA (e outras IDEs modernas), existem três tipos básicos:
\n\n- \n
- Breakpoint linear — colocado em uma linha de código. O programa para toda vez que chega nela. \n
- Breakpoint condicional — você define uma condição (por exemplo,
i == 5). A parada ocorrerá apenas quando a condição for verdadeira. Isso salva em loops de um milhão de iterações. \n - Breakpoint de exceção — captura o momento em que uma exceção específica é lançada (por exemplo,
NullPointerException). Não é colocado em uma linha, mas no tipo de erro. Muito útil se a exceção ocorrer em algum lugar profundo da biblioteca. \n
Exemplo de configuração de breakpoint condicional:
\n\npublic class Main {\n public static void main(String[] args) {\n for (int i = 0; i < 100; i++) {\n // Colocamos breakpoint, condição: i == 42\n System.out.println("Iteração: " + i);\n }\n }\n}\n\nQuando o loop chegar à 42ª iteração, o depurador irá parar. As outras 99 vezes ele passará sem parar.
\n\n1.2. Watchpoints: monitorando campos
\n\nPrecisa saber quem e quando altera o valor de um campo? Use um watchpoint (ponto de observação). Você o coloca em um campo da classe, e o depurador para toda vez que esse campo é lido ou escrito.
\n\npublic class User {\n private String name; // Colocamos watchpoint neste campo\n\n public void setName(String name) {\n this.name = name; // Parada aqui\n }\n\n public String getName() {\n return name; // Ou aqui, se o modo de leitura estiver ativado\n }\n}\n\n2. Ferramentas de depuração Java: o que deve estar no arsenal
\n\nA boa notícia: você não precisa de utilitários de terceiros se tiver uma IDE moderna. Mas conhecer suas capacidades é obrigatório.
\n\n2.1. Depurador do IntelliJ IDEA: recursos ocultos
\n\nAqui estão algumas funções que transformam a depuração de código Java em um prazer:
\n\n- \n
- Drop Frame (botão em forma de seta para baixo) — permite "voltar" a execução para o método anterior na pilha de chamadas. Você não altera o estado do programa, mas pode percorrer a lógica novamente. Indispensável quando você perdeu a etapa necessária. \n
- Evaluate Expression (Alt+F8) — você pode executar qualquer código diretamente durante a depuração. Quer saber o que
list.size()retorna? Ou até alterar o valor de uma variável em tempo real? Por favor. \n - Hot Swap (substituição a quente de código) — alterou um método e quer testar sem reiniciar? O IntelliJ IDEA suporta substituição a quente de classes. Não funciona para todas as alterações (por exemplo, não é possível adicionar um novo campo), mas para o corpo do método é ideal. \n
2.2. Alternativas: Eclipse, VS Code e JDB
\n\nSe você usa Eclipse, existem funções análogas: Display view para expressões e Drop to Frame. No VS Code com Java Ex