Top erros de desenvolvedores Java iniciantes: de A a Z
Java é uma linguagem poderosa, mas rigorosa. Iniciantes frequentemente tropeçam nos mesmos ancinhos que desenvolvedores experientes contornam automaticamente. Neste artigo, vamos analisar 10 erros mais comuns que programadores Java iniciantes cometem. Você aprenderá não apenas por que eles ocorrem, mas também como corrigi-los usando padrões corretos e best practices.
1. NullPointerException (NPE) esquecido
O erro mais popular em Java. Ele ocorre quando você tenta chamar um método ou acessar um campo de um objeto que é igual a null.
Problema
public class User { private String name; public int getNameLength() { return name.length(); // NPE, se name == null }}Solução
Sempre verifique objetos para null antes de usar. Use Optional ou anotações @Nullable / @NonNull.
public int getNameLength() { return Optional.ofNullable(name) .map(String::length) .orElse(0);}2. Ignorar o contrato de equals() e hashCode()
Se você sobrescreve equals(), você deve sobrescrever também hashCode(). Caso contrário, seus objetos não funcionarão corretamente em coleções HashSet, HashMap e outras.
Problema
public class Person { private String id; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(id, person.id); } // hashCode() não foi sobrescrito!}
// Em HashMap dois objetos "iguais" estarão em buckets diferentesMap<Person, String> map = new HashMap<>();map.put(new Person("1"), "Alice");System.out.println(map.get(new Person("1"))); // nullSolução
Sempre use Objects.hash() para gerar o hash code:
@Overridepublic int hashCode() { return Objects.hash(id);}3. Uso incorreto de Generics (tipos brutos)
Usar tipos brutos (raw types) elimina a verificação de tipos em tempo de compilação. Isso leva a ClassCastException em tempo de execução.
Problema
List list = new ArrayList(); // tipo brutolist.add("string");list.add(123); // compilador não reclama
String s = (String) list.get(1); // ClassCastException!Solução
List<String> list = new ArrayList<>();list.add("string");// list.add(123); // erro de compilação — ótimo!String s = list.get(0); // seguro4. Mutação de objetos em coleções
Alterar campos de um objeto que já está em um HashSet ou é chave em um HashMap quebra a estrutura de dados. O hash code do objeto muda, mas o bucket permanece o mesmo.
Problema
Set<StringBuilder> set = new HashSet<>();StringBuilder sb = new StringBuilder("A");set.add(sb);sb.append("B"); // mutaçãoSystem.out.println(set.contains(sb)); // pode ser false!Solução
Use objetos imutáveis (String, Integer, record) como chaves. Se precisar alterar um objeto — remova-o da coleção, altere-o e depois adicione novamente.
5. Tratamento incorreto de exceções
Dois extremos: ou engolir exceções (catch vazio), ou lançar exceções muito genéricas (throws Exception).
Problema
try { // código perigoso} catch (Exception e) { // não fazemos nada — erro perdido}