Como Verificar se um Objeto Double é Nulo em Java

JavaBeginner
Pratique Agora

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.

  1. Abra o arquivo HelloJava.java no editor WebIDE. Se você não o tiver aberto, pode encontrá-lo no File Explorer à esquerda, sob o diretório ~/project.

  2. Substitua o código existente em HelloJava.java pelo 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 chamada price do tipo Double e atribuímos a ela o valor null.
    • if (price == null): Esta é uma instrução if que verifica se a variável price é igual a null. 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 se price for realmente null.
    • Double quantity = 10.5;: Declaramos outra variável Double chamada quantity e atribuímos a ela um valor numérico.
    • A segunda instrução if verifica se quantity é null. Como atribuímos um valor a ela, essa condição será falsa.
  3. Salve o arquivo HelloJava.java (Ctrl+S ou Cmd+S).

  4. Agora, compile o programa modificado. Abra o Terminal na parte inferior do WebIDE e execute o seguinte comando:

    javac HelloJava.java

    Se a compilação for bem-sucedida, você não verá nenhuma saída.

  5. Finalmente, execute o programa compilado:

    java HelloJava

    Você deve ver a seguinte saída:

    Price is not set (it is null).
    Quantity is set to: 10.5

    Esta saída confirma que nosso programa identificou corretamente que price era null e quantity tinha 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.

  1. Abra o arquivo HelloJava.java no editor WebIDE.

  2. 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 como null), zeroDiscount (inicializada como 0.0) e appliedDiscount (inicializada como 5.5).
    • Usamos uma estrutura if-else if-else para 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.
  3. Salve o arquivo HelloJava.java.

  4. Compile o programa no Terminal:

    javac HelloJava.java
  5. Execute o programa compilado:

    java HelloJava

    Você 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.5

    Esta saída mostra claramente como o Java distingue entre um Double null e um Double com um valor de 0.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>.

  1. Abra o arquivo HelloJava.java no editor WebIDE.

  2. 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 classe Optional.
    • Optional<Double> optionalDiscount = Optional.empty();: Criamos um Optional<Double> vazio, representando a ausência de um valor de desconto.
    • Optional<Double> optionalZeroDiscount = Optional.of(0.0);: Criamos um Optional<Double> contendo o valor 0.0. Optional.of() é usado quando você tem certeza de que o valor não é null.
    • Optional<Double> optionalAppliedDiscount = Optional.of(5.5);: Criamos um Optional<Double> contendo o valor 5.5.
    • optionalDiscount.isPresent(): Este método verifica se o Optional contém um valor. É a maneira recomendada de verificar em vez de comparar com null.
    • optionalDiscount.get(): Este método recupera o valor do Optional. Tenha cuidado: Se o Optional estiver vazio, chamar get() lançará uma NoSuchElementException. Sempre verifique isPresent() antes de chamar get(), ou use métodos alternativos como orElse().
    • optionalDiscount.orElse(0.0): Este método retorna o valor dentro do Optional se 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 o Optional está vazio.
  3. Salve o arquivo HelloJava.java.

  4. Compile o programa no Terminal:

    javac HelloJava.java
  5. Execute o programa compilado:

    java HelloJava

    Você 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.0

    Esta saída demonstra como Optional nos ajuda a lidar explicitamente com casos em que um valor pode estar ausente. Usar Optional pode levar a um código mais limpo e robusto, reduzindo o risco de NullPointerException.

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.