Principais erros de desenvolvedores Java iniciantes: de A a Z

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que até os gênios erram em Java?

\n\n

Java é uma linguagem rigorosa, mas gratificante. No entanto, iniciantes frequentemente tropeçam nos mesmos erros clássicos. Segundo estatísticas do Stack Overflow, 70% das perguntas de desenvolvedores Java iniciantes estão relacionadas a cinco erros clássicos. Neste artigo, reunimos os "Principais erros de desenvolvedores Java iniciantes: de A a Z" — desde confusão com == até manipulação incorreta de memória.

\n\n

Analisaremos cada problema com exemplos, para que você não apenas memorize a regra, mas entenda sua essência. Vamos lá!

\n\n

1. Erro nº1: "==" em vez de equals() — o clássico do gênero

\n\n

O erro mais popular é comparar strings com ==. Iniciantes pensam que funciona, e depois se surpreendem quando "Java" == "Java" retorna false.

\n\n

Por que isso acontece?

\n
    \n
  • == compara referências de objetos (endereços na memória).
  • \n
  • equals() compara o conteúdo dos objetos.
  • \n
\n\n

Exemplo:

\n\n
String a = new String("Java");\nString b = new String("Java");\n\nSystem.out.println(a == b);       // false — objetos diferentes no heap\nSystem.out.println(a.equals(b));  // true — mesmo conteúdo\n
\n\n

Dica: Sempre use .equals() para strings. Para tipos primitivos (int, double), == funciona corretamente.

\n\n

2. Erro nº2: Esquecendo o NullPointerException

\n\n

NullPointerException (NPE) é o pior inimigo do júnior. Geralmente ocorre quando você chama um método em null.

\n\n

Cenário típico:

\n\n
public String getName(User user) {\n    return user.getName().toUpperCase(); // Se user == null — NPE!\n}\n
\n\n

Como corrigir? Use programação defensiva:

\n\n
public String getName(User user) {\n    if (user == null) {\n        return "Desconhecido";\n    }\n    return user.getName().toUpperCase();\n}\n
\n\n

Ou, a partir do Java 8, Optional:

\n\n
public String getName(User user) {\n    return Optional.ofNullable(user)\n                   .map(u -> u.getName().toUpperCase())\n                   .orElse("Desconhecido");\n}\n
\n\n

3. Erro nº3: Ignorando exceções

\n\n

Blocos catch vazios são um antipadrão. O erro não desaparece, você apenas o esconde.

\n\n

Código ruim:

\n\n
try {\n    int result = 10 / 0;\n} catch (ArithmeticException e) {\n    // Não fazemos nada — o erro é engolido silenciosamente\n}\n
\n\n

Código bom:

\n\n
try {\n    int result = 10 / 0;\n} catch (ArithmeticException e) {\n    System.err.println("Erro de divisão por zero: " + e.getMessage());\n    // Ou relançamos a exceção adiante\n    throw new RuntimeException("Erro crítico", e);\n}\n
\n\n

4. Erro nº4: Trabalho incorreto com coleções

\n\n

Iniciantes frequentemente confundem List, Set e Map, e também esquecem os genéricos.

\n\n

Erros típicos:

\n\n
    \n
  • Uso de tipos brutos (raw types) — List list = new ArrayList();
  • \n
  • Modificar a coleção durante a iteração sem Iterator.remove()
  • \n
  • Substituir HashMap por TreeMap sem entender a diferença
  • \n
\n\n

Abordagem correta:

\n\n
List<String> names = new ArrayList<>();\nnames.add("Alice");\nnames.add("Bob");\n\n// Remoção durante a iteração\nIterator<String> iterator = names.iterator();\nwhile (iterator.hasNext()) {\n    String name = iterator.next();\n    if (name.equals("Alice")) {\n        iterator.remove(); // Seguro\n    }\n}\n
\n\n

5. Erro nº5: Vazamento de memória e fechamento incorreto de recursos

\n\n

Esquecer de fechar Scanner, FileInputStream ou uma conexão com

Blogs

Book Recommendations