0Pricing
Java Academy · Lección

Problemas del autoboxing

Unboxing de null y trampas de ==

Problemas del autoboxing es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

La comodidad tiene sus trampas

El autoboxing hace que el código sea más limpio, pero oculta conversiones que pueden provocar errores inesperados. Las dos trampas principales son el unboxing de null y la comparación de identidad con ==.

Esta lección muestra cómo evitar ambas.

La trampa del unboxing de null

Si un envoltorio contiene null y realiza su unboxing para convertirlo en un primitivo, Java produce una NullPointerException.

Es fácil pasarlo por alto porque el código parece una asignación sencilla.

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!");
        }
    }
}

null en las operaciones aritméticas

La trampa también aparece dentro de las expresiones. Sumar un envoltorio null hace que Java realice primero su unboxing, lo que produce una excepción antes de que se ejecute la operación matemática.

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!");
        }
    }
}

Prevenir los valores null

Compruebe siempre si un envoltorio es null antes de realizar su unboxing o proporcione un valor predeterminado.

public class Main {
    public static void main(String[] args) {
        Integer maybe = null;
        int safe = (maybe != null) ? maybe : 0;
        System.out.println(safe);
    }
}

La sorpresa de la caché con ==

Integer.valueOf almacena en caché los valores entre -128 y 127. Por tanto, dos valores encapsulados de ese intervalo pueden compartir el mismo objeto y == devuelve true.

public class Main {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        System.out.println(a == b);
    }
}

Fuera de la caché

Por encima del intervalo almacenado en caché, cada operación de boxing crea un objeto distinto. En ese caso, == compara referencias y devuelve false aunque los números sean iguales.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b);
    }
}

Use siempre equals

Como == en los wrappers compara la identidad de los objetos, debe usar .equals() para comparar los valores numéricos reales.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a.equals(b));
    }
}

Mezclar == con un primitivo

Si uno de los lados de == es un primitivo, Java desempaqueta el wrapper, por lo que la comparación se hace por valor. Esto es fiable, pero aun así puede lanzar una excepción si el wrapper es null.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        int b = 200;
        System.out.println(a == b);
    }
}

Autoboxing oculto en bucles

Declarar el acumulador de un bucle como un wrapper hace que se cree un objeto nuevo en cada iteración. En el ejemplo siguiente, usar Long en lugar de long provocaría autoboxing repetido. Prefiera el 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 devuelve null

Un error habitual en situaciones reales: Map.get devuelve null cuando falta una clave. Desempaquetar ese resultado en un int lanza una excepción. Use getOrDefault en su lugar.

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);
    }
}

Trabajar de forma segura

Dos hábitos previenen la mayoría de los errores de autoboxing: nunca desempaquete un valor que pueda ser null y compare siempre los valores de los wrappers con .equals() en lugar de ==.

Comprobación rápida

Compruebe cuánto sabe sobre los problemas del autoboxing.

Resumen

Ha aprendido los principales problemas del autoboxing:

  • Desempaquetar un wrapper null lanza una NullPointerException
  • Proteja el código con una comprobación de null o un valor predeterminado
  • == en wrappers compara referencias, con almacenamiento en caché de -128 a 127
  • Use siempre .equals() para comparar valores
  • Use getOrDefault para evitar valores null al consultar mapas

Preguntas frecuentes

¿La lección «Problemas del autoboxing» es gratis?

Sí — el texto completo de «Problemas del autoboxing» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Problemas del autoboxing»?

Unboxing de null y trampas de == Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Problemas del autoboxing»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Tipos primitivos frente a wrapper
  2. Autoboxing y unboxing
  3. Parsing y Valueof
  4. Problemas del autoboxing
← Volver a Java Academy