Introdução: Por que até os gênios erram em Java?
\n\nJava é 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.
Analisaremos cada problema com exemplos, para que você não apenas memorize a regra, mas entenda sua essência. Vamos lá!
\n\n1. Erro nº1: "==" em vez de equals() — o clássico do gênero
\n\nO erro mais popular é comparar strings com ==. Iniciantes pensam que funciona, e depois se surpreendem quando "Java" == "Java" retorna false.
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
Exemplo:
\n\nString 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\nDica: Sempre use .equals() para strings. Para tipos primitivos (int, double), == funciona corretamente.
2. Erro nº2: Esquecendo o NullPointerException
\n\nNullPointerException (NPE) é o pior inimigo do júnior. Geralmente ocorre quando você chama um método em null.
Cenário típico:
\n\npublic String getName(User user) {\n return user.getName().toUpperCase(); // Se user == null — NPE!\n}\n\n\nComo corrigir? Use programação defensiva:
\n\npublic String getName(User user) {\n if (user == null) {\n return "Desconhecido";\n }\n return user.getName().toUpperCase();\n}\n\n\nOu, a partir do Java 8, Optional:
public String getName(User user) {\n return Optional.ofNullable(user)\n .map(u -> u.getName().toUpperCase())\n .orElse("Desconhecido");\n}\n\n\n3. Erro nº3: Ignorando exceções
\n\nBlocos catch vazios são um antipadrão. O erro não desaparece, você apenas o esconde.
Código ruim:
\n\ntry {\n int result = 10 / 0;\n} catch (ArithmeticException e) {\n // Não fazemos nada — o erro é engolido silenciosamente\n}\n\n\nCódigo bom:
\n\ntry {\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\n4. Erro nº4: Trabalho incorreto com coleções
\n\nIniciantes frequentemente confundem List, Set e Map, e também esquecem os genéricos.
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
HashMapporTreeMapsem entender a diferença \n
Abordagem correta:
\n\nList<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\n5. Erro nº5: Vazamento de memória e fechamento incorreto de recursos
\n\nEsquecer de fechar Scanner, FileInputStream ou uma conexão com