Cómo verificar si un objeto Integer es nulo en Java

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo manejar de forma segura objetos envolventes Integer en Java, centrándote específicamente en verificar si son null. A diferencia del tipo primitivo int, Integer es un objeto que puede contener una referencia null, y no verificar si es null puede provocar errores comunes de NullPointerException.

A través de ejemplos prácticos, explorarás la verificación básica == null, combinarás verificaciones de nulidad con comparaciones de valores y, finalmente, aprenderás cómo aprovechar la clase Optional para un manejo de valores nulos más robusto y expresivo en tu código Java.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/wrapper_classes("Wrapper Classes") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/operators -.-> lab-560008{{"Cómo verificar si un objeto Integer es nulo en Java"}} java/variables -.-> lab-560008{{"Cómo verificar si un objeto Integer es nulo en Java"}} java/if_else -.-> lab-560008{{"Cómo verificar si un objeto Integer es nulo en Java"}} java/classes_objects -.-> lab-560008{{"Cómo verificar si un objeto Integer es nulo en Java"}} java/exceptions -.-> lab-560008{{"Cómo verificar si un objeto Integer es nulo en Java"}} java/wrapper_classes -.-> lab-560008{{"Cómo verificar si un objeto Integer es nulo en Java"}} java/object_methods -.-> lab-560008{{"Cómo verificar si un objeto Integer es nulo en Java"}} end

Probar si un objeto envolvente Integer es nulo

En este paso, exploraremos cómo manejar objetos envolventes Integer en Java, centrándonos específicamente en verificar si son null. A diferencia de los tipos primitivos como int, Integer es una clase, lo que significa que una variable Integer puede contener una referencia a un objeto, o puede ser null si no se refiere a ningún objeto. Manejar valores null es crucial en Java para prevenir errores de NullPointerException, que son muy comunes y pueden hacer que tu programa se bloquee.

Vamos a crear un simple programa en Java para demostrar cómo verificar si un Integer es null.

  1. Abre el archivo HelloJava.java en el editor WebIDE. Si completaste el laboratorio anterior, este archivo ya debería existir en el directorio ~/project.

  2. Reemplaza el código existente en HelloJava.java con lo siguiente:

    public class HelloJava {
        public static void main(String[] args) {
            Integer myInteger = null; // Declarando un Integer y estableciéndolo en null
    
            // Verificar si myInteger es null
            if (myInteger == null) {
                System.out.println("myInteger is null.");
            } else {
                System.out.println("myInteger is not null. Its value is: " + myInteger);
            }
    
            // Vamos a probar con un Integer no nulo
            Integer anotherInteger = 10; // Declarando e inicializando con un valor
    
            // Verificar si anotherInteger es null
            if (anotherInteger == null) {
                System.out.println("anotherInteger is null.");
            } else {
                System.out.println("anotherInteger is not null. Its value is: " + anotherInteger);
            }
        }
    }

    En este código:

    • Declaramos una variable Integer llamada myInteger y la establecemos explícitamente en null.
    • Usamos una instrucción if para verificar si myInteger es igual a null utilizando el operador ==. Esta es la forma estándar de verificar si una referencia a un objeto es null en Java.
    • Luego declaramos otra variable Integer llamada anotherInteger y le asignamos el valor 10. Java convierte automáticamente el valor primitivo int 10 en un objeto Integer (esto se llama autoboxing).
    • Realizamos la misma verificación de null en anotherInteger.
  3. Guarda el archivo HelloJava.java (Ctrl+S o Cmd+S).

  4. Ahora, compila el programa utilizando el comando javac en la Terminal. Asegúrate de estar en el directorio ~/project.

    javac HelloJava.java

    Si no hay errores, la compilación se completará sin mensajes y se creará un archivo HelloJava.class en el directorio ~/project.

  5. Ejecuta el programa compilado utilizando el comando java:

    java HelloJava

    Deberías ver una salida similar a esta:

    myInteger is null.
    anotherInteger is not null. Its value is: 10

    Esta salida confirma que nuestra verificación de null funcionó correctamente tanto para el Integer null como para el Integer no null. Entender cómo verificar si un objeto es null es una habilidad fundamental en la programación en Java, especialmente cuando se trabaja con clases envolventes y objetos que no siempre tienen un valor asignado.

Combinar verificaciones de nulidad y de valor

En el paso anterior, aprendimos cómo verificar si un objeto Integer es null. A menudo, necesitarás verificar si un Integer no es null Y si su valor cumple con una cierta condición. Combinar estas verificaciones es importante porque intentar acceder al valor de un Integer null resultará en un NullPointerException.

Modifiquemos nuestro programa para demostrar cómo combinar una verificación de null con una verificación de valor.

  1. Abre el archivo HelloJava.java en el editor WebIDE.

  2. Reemplaza el código existente con lo siguiente:

    public class HelloJava {
        public static void main(String[] args) {
            Integer score = null; // Ejemplo 1: score es null
    
            // Verificar si score no es null Y su valor es mayor que 50
            if (score != null && score > 50) {
                System.out.println("Score is not null and is greater than 50.");
            } else {
                System.out.println("Score is null or not greater than 50.");
            }
    
            Integer anotherScore = 75; // Ejemplo 2: score es 75
    
            // Verificar si anotherScore no es null Y su valor es mayor que 50
            if (anotherScore != null && anotherScore > 50) {
                System.out.println("anotherScore is not null and is greater than 50.");
            } else {
                System.out.println("anotherScore is null or not greater than 50.");
            }
    
            Integer yetAnotherScore = 40; // Ejemplo 3: score es 40
    
            // Verificar si yetAnotherScore no es null Y su valor es mayor que 50
            if (yetAnotherScore != null && yetAnotherScore > 50) {
                System.out.println("yetAnotherScore is not null and is greater than 50.");
            } else {
                System.out.println("yetAnotherScore is null or not greater than 50.");
            }
        }
    }

    En este código actualizado:

    • Usamos el operador lógico AND (&&) para combinar dos condiciones: score != null y score > 50.
    • La verificación score != null se coloca primero. En Java, el operador && utiliza evaluación de cortocircuito. Esto significa que si la primera condición (score != null) es falsa, la segunda condición (score > 50) no se evalúa. Esto evita un NullPointerException cuando score es null, porque el código score > 50 no se ejecutaría.
    • Probamos esta lógica con tres variables Integer diferentes: una que es null, una que no es null y es mayor que 50, y una que no es null pero no es mayor que 50.
  3. Guarda el archivo HelloJava.java.

  4. Compila el programa modificado en la Terminal:

    javac HelloJava.java
  5. Ejecuta el programa compilado:

    java HelloJava

    Deberías ver una salida similar a esta:

    Score is null or not greater than 50.
    anotherScore is not null and is greater than 50.
    yetAnotherScore is null or not greater than 50.

    Esta salida demuestra cómo funciona la verificación combinada. El primer caso identifica correctamente que score es null. El segundo caso identifica que anotherScore no es null y es mayor que 50. El tercer caso identifica que yetAnotherScore no es mayor que 50, aunque no es null. Este patrón de verificar si un objeto es null antes de acceder a sus propiedades o valor es una práctica de seguridad fundamental en Java.

Utilizar Optional para un manejo seguro

Si bien verificar si un objeto es null utilizando == null y combinar verificaciones con && es efectivo, Java 8 introdujo la clase Optional como una forma más idiomática de manejar valores que pueden no estar presentes (es decir, null). Optional es un objeto contenedor que puede o no contener un valor no nulo. Utilizar Optional puede ayudar a hacer tu código más legible y menos propenso a errores de NullPointerException.

En este paso, refactorizaremos nuestro programa para utilizar Optional<Integer> para manejar valores enteros que posiblemente no estén presentes.

  1. Abre el archivo HelloJava.java en el editor WebIDE.

  2. Reemplaza el código existente con lo siguiente:

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Example 1: Optional containing a null value (empty Optional)
            Optional<Integer> optionalScoreNull = Optional.empty();
    
            // Check if the Optional contains a value and if it's greater than 50
            if (optionalScoreNull.isPresent() && optionalScoreNull.get() > 50) {
                 System.out.println("optionalScoreNull is present and greater than 50.");
            } else {
                 System.out.println("optionalScoreNull is empty or not greater than 50.");
            }
    
            // Example 2: Optional containing a non-null value (75)
            Optional<Integer> optionalScorePresent = Optional.of(75);
    
            // Check if the Optional contains a value and if it's greater than 50
            if (optionalScorePresent.isPresent() && optionalScorePresent.get() > 50) {
                 System.out.println("optionalScorePresent is present and greater than 50.");
            } else {
                 System.out.println("optionalScorePresent is empty or not greater than 50.");
            }
    
            // Example 3: Optional containing a non-null value (40)
            Optional<Integer> optionalScoreNotGreater = Optional.of(40);
    
            // Check if the Optional contains a value and if it's greater than 50
            if (optionalScoreNotGreater.isPresent() && optionalScoreNotGreater.get() > 50) {
                 System.out.println("optionalScoreNotGreater is present and greater than 50.");
            } else {
                 System.out.println("optionalScoreNotGreater is empty or not greater than 50.");
            }
    
            // A more functional way using Optional methods
            System.out.println("\nUsing Optional methods:");
    
            optionalScoreNull.ifPresent(value -> System.out.println("Value from optionalScoreNull: " + value));
            optionalScorePresent.ifPresent(value -> System.out.println("Value from optionalScorePresent: " + value));
            optionalScoreNotGreater.ifPresent(value -> System.out.println("Value from optionalScoreNotGreater: " + value));
    
            // Using orElse to provide a default value if Optional is empty
            Integer scoreOrDefault = optionalScoreNull.orElse(0);
            System.out.println("Value from optionalScoreNull with default: " + scoreOrDefault);
    
            // Using filter for conditional checks
            optionalScorePresent.filter(value -> value > 50)
                                .ifPresent(value -> System.out.println("Filtered optionalScorePresent value: " + value));
    
             optionalScoreNotGreater.filter(value -> value > 50)
                                .ifPresent(value -> System.out.println("Filtered optionalScoreNotGreater value: " + value));
        }
    }

    Veamos los cambios clave:

    • import java.util.Optional;: Importamos la clase Optional.
    • Optional<Integer> optionalScoreNull = Optional.empty();: Creamos un Optional vacío para representar la ausencia de un valor.
    • Optional<Integer> optionalScorePresent = Optional.of(75);: Creamos un Optional que contiene un valor no nulo utilizando Optional.of(). Ten en cuenta que Optional.of() lanzará un NullPointerException si le pasas un valor null. Si el valor puede ser null, utiliza Optional.ofNullable().
    • optionalScoreNull.isPresent(): Este método verifica si el Optional contiene un valor. Es la forma recomendada de verificar la presencia en lugar de verificar si es null.
    • optionalScoreNull.get(): Este método recupera el valor del Optional. ¡Ten cuidado! Si el Optional está vacío, llamar a get() lanzará una NoSuchElementException. Por eso siempre debes verificar isPresent() antes de llamar a get(), o utilizar otros métodos de Optional que manejen adecuadamente el caso de un Optional vacío.
    • optionalScoreNull.ifPresent(value -> ...): Este método ejecuta el código proporcionado solo si el Optional contiene un valor. Es una forma limpia de realizar una acción sobre el valor si existe.
    • optionalScoreNull.orElse(0): Este método devuelve el valor si está presente, de lo contrario devuelve el valor predeterminado especificado (0 en este caso).
    • optionalScorePresent.filter(value -> value > 50): Este método devuelve un Optional que contiene el valor si está presente Y cumple con la condición dada (valor > 50), de lo contrario devuelve un Optional vacío.
  3. Guarda el archivo HelloJava.java.

  4. Compila el programa en la Terminal:

    javac HelloJava.java
  5. Ejecuta el programa compilado:

    java HelloJava

    Deberías ver una salida similar a esta:

    optionalScoreNull is empty or not greater than 50.
    optionalScorePresent is present and greater than 50.
    optionalScoreNotGreater is empty or not greater than 50.
    
    Using Optional methods:
    Value from optionalScorePresent: 75
    Value from optionalScoreNotGreater: 40
    Value from optionalScoreNull with default: 0
    Filtered optionalScorePresent value: 75

    Esta salida muestra cómo se puede utilizar Optional para manejar la presencia o ausencia de valores y realizar operaciones de manera segura. Si bien el patrón if (isPresent() && get() > 50) es similar a la verificación de null, Optional proporciona muchos otros métodos útiles (ifPresent, orElse, filter, map, etc.) que pueden conducir a un código más expresivo y seguro cuando se tratan valores que posiblemente no estén presentes. Utilizar Optional es una buena práctica en el desarrollo moderno de Java.

Resumen

En este laboratorio, aprendimos cómo verificar si un objeto envoltorio Integer es null en Java. Comenzamos entendiendo que Integer es una clase y puede contener una referencia null, a diferencia del tipo primitivo int. Demostramos la verificación básica == null utilizando un sencillo programa en Java, mostrando cómo manejar variables Integer tanto null como no null para prevenir NullPointerException.