Armadilhas do Autoboxing
Desempacotamento nulo e armadilhas de ==
Armadilhas do Autoboxing é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
A conveniência esconde armadilhas
A conversão automática para objeto deixa o código mais limpo, mas esconde conversões que podem causar erros inesperados. As duas maiores armadilhas são o desencaixotamento de nulo e a comparação de identidade com ==.
Esta lição mostra como evitar ambas.
A armadilha do desencaixotamento de nulo
Se um encapsulador contiver null e você o converter para um tipo primitivo, Java lançará uma NullPointerException.
É fácil não perceber isso porque o código se parece com uma atribuição simples.
public class Main {
public static void main(String[] args) {
Integer maybe = null;
try {
int value = maybe;
System.out.println(value);
} catch (NullPointerException e) {
System.out.println("Cannot unbox null!");
}
}
}Nulo em operações aritméticas
A armadilha também ocorre dentro de expressões. Adicionar um encapsulador null faz com que ele seja convertido primeiro para um tipo primitivo, o que lança uma exceção antes mesmo de o cálculo ser executado.
public class Main {
public static void main(String[] args) {
Integer count = null;
try {
int total = count + 5;
System.out.println(total);
} catch (NullPointerException e) {
System.out.println("Null in arithmetic!");
}
}
}Proteção contra nulo
Sempre verifique se um encapsulador é null antes de convertê-lo para um tipo primitivo ou forneça um valor padrão.
public class Main {
public static void main(String[] args) {
Integer maybe = null;
int safe = (maybe != null) ? maybe : 0;
System.out.println(safe);
}
}A surpresa do cache com ==
Integer.valueOf armazena em cache valores de -128 a 127. Assim, dois valores convertidos para objetos dentro desse intervalo podem compartilhar o mesmo objeto, e == retorna true.
public class Main {
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
}
}Fora do intervalo do cache
Acima do intervalo armazenado em cache, cada conversão para objeto cria um objeto distinto. Nesse caso, == compara referências e retorna false, mesmo que os números sejam iguais.
public class Main {
public static void main(String[] args) {
Integer a = 200;
Integer b = 200;
System.out.println(a == b);
}
}Use sempre equals
Como == em classes de encapsulamento compara a identidade dos objetos, você deve usar .equals() para comparar os valores numéricos reais.
public class Main {
public static void main(String[] args) {
Integer a = 200;
Integer b = 200;
System.out.println(a.equals(b));
}
}Misturando == com um tipo primitivo
Se um dos lados de == for um tipo primitivo, Java desempacota automaticamente o objeto de encapsulamento, portanto a comparação é feita por valor. Isso é confiável, mas ainda pode lançar uma exceção se o objeto de encapsulamento for nulo.
public class Main {
public static void main(String[] args) {
Integer a = 200;
int b = 200;
System.out.println(a == b);
}
}Empacotamento oculto em laços
Declarar o acumulador de um laço como um objeto de encapsulamento cria um novo objeto a cada iteração. Abaixo, usar Long em vez de long faria o empacotamento repetidamente. Prefira o tipo primitivo.
public class Main {
public static void main(String[] args) {
long sum = 0;
for (int i = 0; i < 1000; i++) {
sum += i;
}
System.out.println(sum);
}
}Map.get retorna nulo
Um erro comum em aplicações reais: Map.get retorna null quando a chave não existe. Desempacotar esse resultado em um int lança uma exceção. Use getOrDefault em vez disso.
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> scores = new HashMap<>();
int score = scores.getOrDefault("missing", 0);
System.out.println(score);
}
}Mantendo a segurança
Dois hábitos evitam a maioria dos problemas de empacotamento automático: nunca desempacote um valor que possa ser null e sempre compare valores de objetos de encapsulamento com .equals(), em vez de ==.
Verificação rápida
Teste sua atenção aos problemas do empacotamento automático.
Recapitulação
Você aprendeu os principais problemas do empacotamento automático:
- Desempacotar um objeto de encapsulamento
nulllança umaNullPointerException - Proteja o código com uma verificação de nulo ou um valor padrão
==em objetos de encapsulamento compara referências, com armazenamento em cache de -128 a 127- Use sempre
.equals()para comparar valores - Use
getOrDefaultpara evitar nulos em consultas a mapas
Perguntas Frequentes
A aula “Armadilhas do Autoboxing” é grátis?
Sim — o texto completo de “Armadilhas do Autoboxing” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Armadilhas do Autoboxing”?
Desempacotamento nulo e armadilhas de == Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Armadilhas do Autoboxing”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Tipos Primitivos versus Tipos Envoltórios
- Autoboxing e Unboxing
- Análise e Valueof
- Armadilhas do Autoboxing