Introducción
En este laboratorio, aprenderás cómo verificar si un objeto Double es nulo en Java. Exploraremos la diferencia entre el tipo primitivo double y la clase envolvente Double, y cómo manejar posibles errores de NullPointerException.
El laboratorio te guiará a través de la verificación de valores nulos utilizando el operador de igualdad, la distinción entre valores nulos y cero, y el uso de la clase Optional para un manejo más robusto de valores nulos. Implementarás y probarás ejemplos de código para consolidar tu comprensión de estos conceptos.
Verificar si el envoltorio Double es nulo
En este paso, exploraremos cómo manejar objetos de la clase envolvente Double en Java, centrándonos específicamente en verificar si una variable de tipo Double es null. A diferencia de los tipos primitivos como double, las clases envolventes como Double pueden contener un valor null, que representa la ausencia de un valor. Es crucial manejar correctamente los valores null para evitar errores de NullPointerException en tus programas.
Vamos a crear un sencillo programa en Java para demostrar cómo verificar si un objeto Double es null.
Abre el archivo
HelloJava.javaen el editor del WebIDE. Si no lo tienes abierto, puedes encontrarlo en el Explorador de archivos a la izquierda, en el directorio~/project.Reemplaza el código existente en
HelloJava.javacon el siguiente código:public class HelloJava { public static void main(String[] args) { Double price = null; // Declare a Double variable and initialize it to null if (price == null) { System.out.println("Price is not set (it is null)."); } else { System.out.println("Price is set to: " + price); } Double quantity = 10.5; // Declare another Double variable and give it a value if (quantity == null) { System.out.println("Quantity is not set (it is null)."); } else { System.out.println("Quantity is set to: " + quantity); } } }Veamos las nuevas partes de este código:
Double price = null;: Declaramos una variable llamadapricede tipoDoubley le asignamos el valornull.if (price == null): Esta es una instrucciónifque verifica si la variablepricees igual anull. El operador==se utiliza para comparar si la referencia al objeto esnull.System.out.println("Price is not set (it is null).");: Esta línea se ejecutará sipricees realmentenull.Double quantity = 10.5;: Declaramos otra variable de tipoDoublellamadaquantityy le asignamos un valor numérico.- La segunda instrucción
ifverifica siquantityesnull. Dado que le asignamos un valor, esta condición será falsa.
Guarda el archivo
HelloJava.java(Ctrl+S o Cmd+S).Ahora, compila el programa modificado. Abre la Terminal en la parte inferior del WebIDE y ejecuta el siguiente comando:
javac HelloJava.javaSi la compilación es exitosa, no verás ninguna salida.
Finalmente, ejecuta el programa compilado:
java HelloJavaDeberías ver la siguiente salida:
Price is not set (it is null). Quantity is set to: 10.5Esta salida confirma que nuestro programa identificó correctamente que
priceeranully quequantitytenía un valor.
Comprender cómo verificar si un objeto es null es fundamental cuando se trabaja con objetos en Java, especialmente con clases envolventes. En el siguiente paso, exploraremos la diferencia entre un objeto Double null y un objeto Double con un valor de cero.
Manejar valores nulos y valores cero
En el paso anterior, aprendimos cómo verificar si un objeto de la clase envolvente Double es null. Ahora, exploremos la diferencia entre un objeto Double que es null y uno que tiene un valor de cero (0.0). Esta distinción es importante porque null significa "sin valor", mientras que 0.0 es un valor numérico específico.
Consideremos un escenario en el que estás rastreando el descuento aplicado a un producto. Un descuento null podría significar que la información del descuento no está disponible, mientras que un descuento de 0.0 significa que explícitamente no se ha aplicado ningún descuento.
Modifiquemos nuestro programa HelloJava.java para demostrar esta diferencia.
Abre el archivo
HelloJava.javaen el editor del WebIDE.Reemplaza el código existente con el siguiente:
public class HelloJava { public static void main(String[] args) { Double discount = null; // Discount information not available if (discount == null) { System.out.println("Discount information is not available (it is null)."); } else if (discount == 0.0) { System.out.println("There is no discount (value is 0.0)."); } else { System.out.println("Discount applied: " + discount); } System.out.println("---"); // Separator for clarity Double zeroDiscount = 0.0; // Explicitly no discount if (zeroDiscount == null) { System.out.println("Discount information is not available (it is null)."); } else if (zeroDiscount == 0.0) { System.out.println("There is no discount (value is 0.0)."); } else { System.out.println("Discount applied: " + zeroDiscount); } System.out.println("---"); // Separator for clarity Double appliedDiscount = 5.5; // A specific discount value if (appliedDiscount == null) { System.out.println("Discount information is not available (it is null)."); } else if (appliedDiscount == 0.0) { System.out.println("There is no discount (value is 0.0)."); } else { System.out.println("Discount applied: " + appliedDiscount); } } }En este código actualizado:
- Introducimos tres variables de tipo
Double:discount(inicializada anull),zeroDiscount(inicializada a0.0) yappliedDiscount(inicializada a5.5). - Usamos una estructura
if-else if-elsepara verificar el estado de cada variable:- Primero, verificamos si la variable es
null. - Si no es
null, luego verificamos si su valor es0.0. - De lo contrario, asumimos que se ha aplicado un valor de descuento específico.
- Primero, verificamos si la variable es
- Introducimos tres variables de tipo
Guarda el archivo
HelloJava.java.Compila el programa en la Terminal:
javac HelloJava.javaEjecuta el programa compilado:
java HelloJavaDeberías ver la siguiente salida:
Discount information is not available (it is null). --- There is no discount (value is 0.0). --- Discount applied: 5.5Esta salida muestra claramente cómo Java distingue entre un objeto
Doublenully uno con un valor de0.0. Manejar estos casos correctamente es esencial para escribir aplicaciones Java robustas.
En el siguiente paso, exploraremos un enfoque más moderno para manejar posibles valores null utilizando la clase Optional, que puede hacer tu código más seguro y legible.
Probar con la clase Optional
En Java moderno (Java 8 y versiones posteriores), la clase Optional se utiliza a menudo para representar un valor que puede o no estar presente. Esto proporciona una forma más explícita y segura de manejar posibles valores null en comparación con simplemente usar referencias null. El uso de Optional puede ayudar a prevenir errores de NullPointerException y hacer que tu código sea más legible.
Reescribamos nuestro ejemplo de descuento utilizando la clase Optional<Double>.
Abre el archivo
HelloJava.javaen el editor del WebIDE.Reemplaza el código existente con el siguiente:
import java.util.Optional; public class HelloJava { public static void main(String[] args) { // Representing a discount that might be null Optional<Double> optionalDiscount = Optional.empty(); if (optionalDiscount.isPresent()) { System.out.println("Discount is present: " + optionalDiscount.get()); } else { System.out.println("Discount is not present (Optional is empty)."); } System.out.println("---"); // Separator for clarity // Representing a discount with a value of 0.0 Optional<Double> optionalZeroDiscount = Optional.of(0.0); if (optionalZeroDiscount.isPresent()) { System.out.println("Discount is present: " + optionalZeroDiscount.get()); } else { System.out.println("Discount is not present (Optional is empty)."); } System.out.println("---"); // Separator for clarity // Representing a discount with a specific value Optional<Double> optionalAppliedDiscount = Optional.of(5.5); if (optionalAppliedDiscount.isPresent()) { System.out.println("Discount is present: " + optionalAppliedDiscount.get()); } else { System.out.println("Discount is not present (Optional is empty)."); } System.out.println("---"); // Separator for clarity // A common way to handle Optional: using orElse Double finalDiscount = optionalDiscount.orElse(0.0); System.out.println("Using orElse: Final discount is " + finalDiscount); Double finalZeroDiscount = optionalZeroDiscount.orElse(0.0); System.out.println("Using orElse: Final zero discount is " + finalZeroDiscount); } }Veamos los cambios clave:
import java.util.Optional;: Importamos la claseOptional.Optional<Double> optionalDiscount = Optional.empty();: Creamos unOptional<Double>vacío, que representa la ausencia de un valor de descuento.Optional<Double> optionalZeroDiscount = Optional.of(0.0);: Creamos unOptional<Double>que contiene el valor0.0.Optional.of()se utiliza cuando estás seguro de que el valor no esnull.Optional<Double> optionalAppliedDiscount = Optional.of(5.5);: Creamos unOptional<Double>que contiene el valor5.5.optionalDiscount.isPresent(): Este método verifica si elOptionalcontiene un valor. Es la forma recomendada de verificar en lugar de comparar connull.optionalDiscount.get(): Este método recupera el valor delOptional. Ten cuidado: Si elOptionalestá vacío, llamar aget()lanzará unaNoSuchElementException. Siempre verificaisPresent()antes de llamar aget(), o utiliza métodos alternativos comoorElse().optionalDiscount.orElse(0.0): Este método devuelve el valor dentro delOptionalsi está presente; de lo contrario, devuelve el valor predeterminado proporcionado (en este caso,0.0). Esta es una forma segura de obtener un valor y manejar el caso en el que elOptionalestá vacío.
Guarda el archivo
HelloJava.java.Compila el programa en la Terminal:
javac HelloJava.javaEjecuta el programa compilado:
java HelloJavaDeberías ver la siguiente salida:
Discount is not present (Optional is empty). --- Discount is present: 0.0 --- Discount is present: 5.5 --- Using orElse: Final discount is 0.0 Using orElse: Final zero discount is 0.0Esta salida demuestra cómo
Optionalnos ayuda a manejar explícitamente los casos en los que un valor puede faltar. El uso deOptionalpuede conducir a un código más limpio y robusto al reducir el riesgo deNullPointerException.
Ahora has aprendido cómo verificar si hay un valor null en objetos de la clase envolvente Double, diferenciar entre valores null y valores cero, y usar la clase Optional para manejar de forma más segura posibles valores que falten. Estos son conceptos importantes para escribir código Java confiable.
Resumen
En este laboratorio, aprendimos cómo verificar si un objeto de la clase envolvente Double en Java es null. Vimos que, a diferencia del tipo primitivo double, Double puede contener un valor null. Demostramos cómo usar la comparación == null para verificar la ausencia de un valor en una variable de tipo Double y prevenir posibles errores de NullPointerException. También exploramos la diferencia entre un valor null y un valor cero para un objeto Double y cómo manejar adecuadamente ambos casos. Finalmente, nos presentaron la clase Optional como un enfoque moderno de Java para manejar posibles valores nulos de manera más explícita y segura.



