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

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"))); // null


Soluçã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); // seguro


4. 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}

Blogs

Book Recommendations