Introdução
Neste laboratório, você aprenderá como verificar se um objeto Double é nulo em Java. Exploraremos a diferença entre o double primitivo e a classe wrapper Double, e como lidar com potenciais erros NullPointerException.
O laboratório irá guiá-lo através da verificação de nulos usando o operador de igualdade, distinguindo entre valores nulos e zero, e utilizando a classe Optional para um tratamento de nulos mais robusto. Você implementará e testará exemplos de código para solidificar sua compreensão desses conceitos.
Verificar Double Wrapper para Nulo
Nesta etapa, exploraremos como lidar com objetos wrapper Double em Java, focando especificamente em verificar se uma variável Double é null. Ao contrário de tipos primitivos como double, classes wrapper como Double podem conter um valor null, que representa a ausência de um valor. É crucial lidar com valores null corretamente para evitar erros NullPointerException em seus programas.
Vamos criar um programa Java simples para demonstrar a verificação de null em um objeto Double.
Abra o arquivo
HelloJava.javano editor WebIDE. Se você não o tiver aberto, pode encontrá-lo no File Explorer à esquerda, sob o diretório~/project.Substitua o código existente em
HelloJava.javapelo seguinte 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); } } }Vamos analisar as novas partes deste código:
Double price = null;: Declaramos uma variável chamadapricedo tipoDoublee atribuímos a ela o valornull.if (price == null): Esta é uma instruçãoifque verifica se a variávelpriceé igual anull. O operador==é usado para comparar se a referência ao objeto énull.System.out.println("Price is not set (it is null).");: Esta linha será executada sepricefor realmentenull.Double quantity = 10.5;: Declaramos outra variávelDoublechamadaquantitye atribuímos a ela um valor numérico.- A segunda instrução
ifverifica sequantityénull. Como atribuímos um valor a ela, essa condição será falsa.
Salve o arquivo
HelloJava.java(Ctrl+S ou Cmd+S).Agora, compile o programa modificado. Abra o Terminal na parte inferior do WebIDE e execute o seguinte comando:
javac HelloJava.javaSe a compilação for bem-sucedida, você não verá nenhuma saída.
Finalmente, execute o programa compilado:
java HelloJavaVocê deve ver a seguinte saída:
Price is not set (it is null). Quantity is set to: 10.5Esta saída confirma que nosso programa identificou corretamente que
priceeranullequantitytinha um valor.
Compreender como verificar null é fundamental ao trabalhar com objetos Java, especialmente classes wrapper. Na próxima etapa, exploraremos a diferença entre um Double null e um Double com um valor de zero.
Lidar com Valores Nulos vs Zero
Na etapa anterior, aprendemos como verificar se um objeto wrapper Double é null. Agora, vamos explorar a diferença entre um Double sendo null e um Double tendo um valor de zero (0.0). Essa distinção é importante porque null significa "nenhum valor", enquanto 0.0 é um valor numérico específico.
Considere um cenário em que você está rastreando o desconto aplicado a um produto. Um desconto null pode significar que as informações de desconto não estão disponíveis, enquanto um desconto de 0.0 significa que explicitamente nenhum desconto foi aplicado.
Vamos modificar nosso programa HelloJava.java para demonstrar essa diferença.
Abra o arquivo
HelloJava.javano editor WebIDE.Substitua o código existente pelo seguinte:
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); } } }Neste código atualizado:
- Introduzimos três variáveis
Double:discount(inicializada comonull),zeroDiscount(inicializada como0.0) eappliedDiscount(inicializada como5.5). - Usamos uma estrutura
if-else if-elsepara verificar o estado de cada variável:- Primeiro, verificamos se a variável é
null. - Se não for
null, verificamos se seu valor é0.0. - Caso contrário, assumimos que um valor de desconto específico foi aplicado.
- Primeiro, verificamos se a variável é
- Introduzimos três variáveis
Salve o arquivo
HelloJava.java.Compile o programa no Terminal:
javac HelloJava.javaExecute o programa compilado:
java HelloJavaVocê deve ver a seguinte saída:
Discount information is not available (it is null). --- There is no discount (value is 0.0). --- Discount applied: 5.5Esta saída mostra claramente como o Java distingue entre um
Doublenulle umDoublecom um valor de0.0. Lidar com esses casos corretamente é essencial para escrever aplicações Java robustas.
Na próxima etapa, exploraremos uma abordagem mais moderna para lidar com potenciais valores null usando a classe Optional, que pode tornar seu código mais seguro e legível.
Testar com a Classe Optional
Em Java moderno (Java 8 e posterior), a classe Optional é frequentemente usada para representar um valor que pode ou não estar presente. Isso fornece uma maneira mais explícita e segura de lidar com potenciais valores null em comparação com o uso simples de referências null. Usar Optional pode ajudar a prevenir erros NullPointerException e tornar seu código mais legível.
Vamos reescrever nosso exemplo de desconto usando a classe Optional<Double>.
Abra o arquivo
HelloJava.javano editor WebIDE.Substitua o código existente pelo seguinte:
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); } }Vamos analisar as principais mudanças:
import java.util.Optional;: Importamos a classeOptional.Optional<Double> optionalDiscount = Optional.empty();: Criamos umOptional<Double>vazio, representando a ausência de um valor de desconto.Optional<Double> optionalZeroDiscount = Optional.of(0.0);: Criamos umOptional<Double>contendo o valor0.0.Optional.of()é usado quando você tem certeza de que o valor não énull.Optional<Double> optionalAppliedDiscount = Optional.of(5.5);: Criamos umOptional<Double>contendo o valor5.5.optionalDiscount.isPresent(): Este método verifica se oOptionalcontém um valor. É a maneira recomendada de verificar em vez de comparar comnull.optionalDiscount.get(): Este método recupera o valor doOptional. Tenha cuidado: Se oOptionalestiver vazio, chamarget()lançará umaNoSuchElementException. Sempre verifiqueisPresent()antes de chamarget(), ou use métodos alternativos comoorElse().optionalDiscount.orElse(0.0): Este método retorna o valor dentro doOptionalse ele estiver presente; caso contrário, ele retorna o valor padrão fornecido (neste caso,0.0). Esta é uma maneira segura de obter um valor e lidar com o caso em que oOptionalestá vazio.
Salve o arquivo
HelloJava.java.Compile o programa no Terminal:
javac HelloJava.javaExecute o programa compilado:
java HelloJavaVocê deve ver a seguinte saída:
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 saída demonstra como
Optionalnos ajuda a lidar explicitamente com casos em que um valor pode estar ausente. UsarOptionalpode levar a um código mais limpo e robusto, reduzindo o risco deNullPointerException.
Você agora aprendeu como verificar null em objetos wrapper Double, diferenciar entre valores null e zero e usar a classe Optional para um tratamento mais seguro de valores potencialmente ausentes. Estes são conceitos importantes para escrever código Java confiável.
Resumo
Neste laboratório, aprendemos como verificar se um objeto wrapper Double em Java é null. Vimos que, ao contrário do double primitivo, Double pode conter um valor null. Demonstramos como usar a comparação == null para verificar a ausência de um valor em uma variável Double e prevenir potenciais erros NullPointerException. Também exploramos a diferença entre um valor null e um valor zero para um objeto Double e como lidar com ambos os casos de forma apropriada. Finalmente, fomos introduzidos à classe Optional como uma abordagem moderna do Java para lidar com potenciais valores nulos de forma mais explícita e segura.



