0Pricing
Java Academy · Aula

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 null lança uma NullPointerException
  • 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 getOrDefault para 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

  1. Tipos Primitivos versus Tipos Envoltórios
  2. Autoboxing e Unboxing
  3. Análise e Valueof
  4. Armadilhas do Autoboxing
← Voltar para Java Academy