Introdução: Por que os iniciantes em Java frequentemente erram?
Java é uma das linguagens de programação mais populares e requisitadas do mundo. No entanto, sua tipagem forte, a abundância de código boilerplate e as particularidades do gerenciamento de memória frequentemente confundem desenvolvedores iniciantes. Até programadores experientes às vezes cometem erros clássicos, mas para iniciantes, eles podem causar horas de debug.
Neste artigo, analisaremos os 10 erros mais comuns de desenvolvedores Java iniciantes. Você aprenderá como identificá-los, corrigi-los e, mais importante, como evitá-los no futuro. Cada tópico é acompanhado por um exemplo de código claro e uma dica prática.
1. Esquecer do NullPointerException (NPE)
O erro mais famoso e traiçoeiro em Java. Na maioria das vezes, o NPE ocorre quando você tenta chamar um método ou acessar um campo de um objeto que é null.
Exemplo de erro
public class Main {
public static void main(String[] args) {
String text = null;
int length = text.length(); // NullPointerException!
}
}
Como corrigir
- Sempre verifique se os objetos são
nullantes de usá-los. - Use
Optionalpara métodos que podem retornar um valor vazio. - Aplique as anotações
@Nullablee@NonNullpara documentar o código.
public static int getLengthSafely(String text) {
return Optional.ofNullable(text)
.map(String::length)
.orElse(0);
}
2. Comparar strings com == em vez de equals()
O operador == compara referências de objetos, não seu conteúdo. Para strings, isso é crítico, pois o Java usa um pool de strings e cria novos objetos ao chamar new String().
Exemplo de erro
String a = "Hello";
String b = new String("Hello");
System.out.println(a == b); // false! Embora as strings sejam iguais
Como corrigir
- Sempre use
equals()para comparar o conteúdo de strings. - Para ignorar maiúsculas/minúsculas, use
equalsIgnoreCase().
System.out.println(a.equals(b)); // true
3. Ignorar recursos: não fechar Connection, File ou Stream
Trabalhar com arquivos, bancos de dados ou conexões de rede exige o fechamento explícito dos recursos. Se isso não for feito, ocorre vazamento de memória e bloqueio de arquivos.
Exemplo de erro
FileInputStream fis = new FileInputStream("file.txt");
// Trabalhamos com o arquivo
// Esquecemos de chamar fis.close();
Como corrigir
A partir do Java 7, use a construção try-with-resources. Os recursos serão fechados automaticamente, mesmo se ocorrer uma exceção.
try (FileInputStream fis = new FileInputStream("file.txt")) {
// Trabalhamos com o arquivo
} catch (IOException e) {
e.printStackTrace();
}
4. Não entender os princípios 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 como HashSet, HashMap e similares.
Exemplo de erro
class User {
String name;
User(String name) { this.name = name; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(name, user.name);
}
// hashCode não foi sobrescrito!
}
Set<User> users = new HashSet<>();
users.add(new User("Alice"));
users.add(new User("Alice"));
System.out.println(users.size()); // 2, embora fosse esperado 1