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.
Probar si el envoltorio 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.
Abre el archivo
HelloJava.javaen el editor WebIDE. Si completaste el laboratorio anterior, este archivo ya debería existir en el directorio~/project.Reemplaza el código existente en
HelloJava.javacon 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
IntegerllamadamyIntegery la establecemos explícitamente ennull. - Usamos una instrucción
ifpara verificar simyIntegeres igual anullutilizando el operador==. Esta es la forma estándar de verificar si una referencia a un objeto esnullen Java. - Luego declaramos otra variable
IntegerllamadaanotherIntegery le asignamos el valor10. Java convierte automáticamente el valor primitivoint10en un objetoInteger(esto se llama autoboxing). - Realizamos la misma verificación de
nullenanotherInteger.
- Declaramos una variable
Guarda el archivo
HelloJava.java(Ctrl+S o Cmd+S).Ahora, compila el programa utilizando el comando
javacen la Terminal. Asegúrate de estar en el directorio~/project.javac HelloJava.javaSi no hay errores, la compilación se completará sin mensajes y se creará un archivo
HelloJava.classen el directorio~/project.Ejecuta el programa compilado utilizando el comando
java:java HelloJavaDeberías ver una salida similar a esta:
myInteger is null. anotherInteger is not null. Its value is: 10Esta salida confirma que nuestra verificación de
nullfuncionó correctamente tanto para elIntegernullcomo para elIntegernonull. Entender cómo verificar si un objeto esnulles 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 comprobaciones 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.
Abre el archivo
HelloJava.javaen el editor WebIDE.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 != nullyscore > 50. - La verificación
score != nullse 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 unNullPointerExceptioncuandoscoreesnull, porque el códigoscore > 50no se ejecutaría. - Probamos esta lógica con tres variables
Integerdiferentes: una que esnull, una que no esnully es mayor que 50, y una que no esnullpero no es mayor que 50.
- Usamos el operador lógico AND (
Guarda el archivo
HelloJava.java.Compila el programa modificado en la Terminal:
javac HelloJava.javaEjecuta el programa compilado:
java HelloJavaDeberí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
scoreesnull. El segundo caso identifica queanotherScoreno esnully es mayor que 50. El tercer caso identifica queyetAnotherScoreno es mayor que 50, aunque no esnull. Este patrón de verificar si un objeto esnullantes 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.
Abre el archivo
HelloJava.javaen el editor WebIDE.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 claseOptional.Optional<Integer> optionalScoreNull = Optional.empty();: Creamos unOptionalvacío para representar la ausencia de un valor.Optional<Integer> optionalScorePresent = Optional.of(75);: Creamos unOptionalque contiene un valor no nulo utilizandoOptional.of(). Ten en cuenta queOptional.of()lanzará unNullPointerExceptionsi le pasas un valornull. Si el valor puede sernull, utilizaOptional.ofNullable().optionalScoreNull.isPresent(): Este método verifica si elOptionalcontiene un valor. Es la forma recomendada de verificar la presencia en lugar de verificar si esnull.optionalScoreNull.get(): Este método recupera el valor delOptional. ¡Ten cuidado! Si elOptionalestá vacío, llamar aget()lanzará unaNoSuchElementException. Por eso siempre debes verificarisPresent()antes de llamar aget(), o utilizar otros métodos deOptionalque manejen adecuadamente el caso de unOptionalvacío.optionalScoreNull.ifPresent(value -> ...): Este método ejecuta el código proporcionado solo si elOptionalcontiene 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 unOptionalque contiene el valor si está presente Y cumple con la condición dada (valor > 50), de lo contrario devuelve unOptionalvacío.
Guarda el archivo
HelloJava.java.Compila el programa en la Terminal:
javac HelloJava.javaEjecuta el programa compilado:
java HelloJavaDeberí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: 75Esta salida muestra cómo se puede utilizar
Optionalpara manejar la presencia o ausencia de valores y realizar operaciones de manera segura. Si bien el patrónif (isPresent() && get() > 50)es similar a la verificación denull,Optionalproporciona 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. UtilizarOptionales 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.



