如何在 Java 中检查 Double 对象是否为 null

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何在 Java 中检查一个 Double 对象是否为 null。我们将探讨基本数据类型 doubleDouble 包装类之间的区别,以及如何处理潜在的 NullPointerException 错误。

本实验将引导你使用相等运算符检查 null,区分 null 和零值,并利用 Optional 类进行更健壮的 null 处理。你将实现并测试代码示例,以巩固对这些概念的理解。


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/data_types("Data Types") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/wrapper_classes("Wrapper Classes") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/data_types -.-> lab-559944{{"如何在 Java 中检查 Double 对象是否为 null"}} java/variables -.-> lab-559944{{"如何在 Java 中检查 Double 对象是否为 null"}} java/if_else -.-> lab-559944{{"如何在 Java 中检查 Double 对象是否为 null"}} java/classes_objects -.-> lab-559944{{"如何在 Java 中检查 Double 对象是否为 null"}} java/wrapper_classes -.-> lab-559944{{"如何在 Java 中检查 Double 对象是否为 null"}} java/object_methods -.-> lab-559944{{"如何在 Java 中检查 Double 对象是否为 null"}} end

检查 Double 包装类是否为 Null

在这一步中,我们将探讨如何在 Java 中处理 Double 包装类对象,特别关注检查 Double 变量是否为 null。与 double 等基本数据类型不同,Double 等包装类可以持有 null 值,该值表示没有值。正确处理 null 值对于防止程序中出现 NullPointerException 错误至关重要。

让我们创建一个简单的 Java 程序来演示如何检查 Double 对象是否为 null

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。如果你还没有打开它,可以在左侧文件资源管理器的 ~/project 目录下找到它。

  2. HelloJava.java 中的现有代码替换为以下代码:

    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);
            }
        }
    }

    让我们看看这段代码的新部分:

    • Double price = null;:我们声明了一个名为 priceDouble 类型变量,并将其赋值为 null
    • if (price == null):这是一个 if 语句,用于检查 price 变量是否等于 null== 运算符用于比较对象的引用是否为 null
    • System.out.println("Price is not set (it is null).");:如果 price 确实为 null,则会执行这一行。
    • Double quantity = 10.5;:我们声明了另一个名为 quantityDouble 变量,并为其赋值一个数值。
    • 第二个 if 语句检查 quantity 是否为 null。由于我们已经为其赋值,这个条件将为 false。
  3. 保存 HelloJava.java 文件(Ctrl+S 或 Cmd+S)。

  4. 现在,编译修改后的程序。打开 WebIDE 底部的终端并运行以下命令:

    javac HelloJava.java

    如果编译成功,你将看不到任何输出。

  5. 最后,运行编译后的程序:

    java HelloJava

    你应该会看到以下输出:

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

    这个输出证实了我们的程序正确识别出 pricenull,而 quantity 有一个值。

理解如何检查 null 是处理 Java 对象(尤其是包装类)时的基础。在下一步中,我们将探讨 nullDouble 和值为零的 Double 之间的区别。

处理 Null 和零值

在上一步中,我们学习了如何检查 Double 包装类对象是否为 null。现在,让我们探讨 DoublenullDouble 值为零(0.0)之间的区别。这种区别很重要,因为 null 表示“没有值”,而 0.0 是一个具体的数值。

设想一个场景,你正在跟踪应用于某个产品的折扣。null 折扣可能意味着折扣信息不可用,而 0.0 折扣则表示明确没有应用折扣。

让我们修改 HelloJava.java 程序来演示这种区别。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 将现有代码替换为以下代码:

    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);
            }
        }
    }

    在这段更新后的代码中:

    • 我们引入了三个 Double 变量:discount(初始化为 null)、zeroDiscount(初始化为 0.0)和 appliedDiscount(初始化为 5.5)。
    • 我们使用 if-else if-else 结构来检查每个变量的状态:
      • 首先,我们检查变量是否为 null
      • 如果不是 null,我们接着检查其值是否为 0.0
      • 否则,我们假设应用了一个具体的折扣值。
  3. 保存 HelloJava.java 文件。

  4. 在终端中编译程序:

    javac HelloJava.java
  5. 运行编译后的程序:

    java HelloJava

    你应该会看到以下输出:

    Discount information is not available (it is null).
    ---
    There is no discount (value is 0.0).
    ---
    Discount applied: 5.5

    这个输出清晰地展示了 Java 如何区分 nullDouble 和值为 0.0Double。正确处理这些情况对于编写健壮的 Java 应用程序至关重要。

在下一步中,我们将探索一种更现代的方法,即使用 Optional 类来处理潜在的 null 值,这可以让你的代码更安全、更易读。

使用 Optional 类进行测试

在现代 Java(Java 8 及更高版本)中,Optional 类常被用于表示一个可能存在也可能不存在的值。与单纯使用 null 引用相比,这为处理潜在的 null 值提供了一种更明确、更安全的方式。使用 Optional 有助于防止 NullPointerException 错误,并使你的代码更易读。

让我们使用 Optional<Double> 类重写我们的折扣示例。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 将现有代码替换为以下代码:

    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);
        }
    }

    让我们看看主要的改动:

    • import java.util.Optional;:我们导入了 Optional 类。
    • Optional<Double> optionalDiscount = Optional.empty();:我们创建了一个空的 Optional<Double>,表示没有折扣值。
    • Optional<Double> optionalZeroDiscount = Optional.of(0.0);:我们创建了一个包含值 0.0Optional<Double>。当你确定值不为 null 时,可以使用 Optional.of()
    • Optional<Double> optionalAppliedDiscount = Optional.of(5.5);:我们创建了一个包含值 5.5Optional<Double>
    • optionalDiscount.isPresent():此方法用于检查 Optional 是否包含值。这是推荐的检查方式,而非与 null 进行比较。
    • optionalDiscount.get():此方法用于从 Optional 中获取值。注意:如果 Optional 为空,调用 get() 会抛出 NoSuchElementException。在调用 get() 之前,一定要先检查 isPresent(),或者使用 orElse() 等替代方法。
    • optionalDiscount.orElse(0.0):如果 Optional 中存在值,此方法将返回该值;否则,它将返回提供的默认值(在本例中为 0.0)。这是一种安全的获取值并处理 Optional 为空情况的方式。
  3. 保存 HelloJava.java 文件。

  4. 在终端中编译程序:

    javac HelloJava.java
  5. 运行编译后的程序:

    java HelloJava

    你应该会看到以下输出:

    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

    这个输出展示了 Optional 如何帮助我们明确处理值可能缺失的情况。使用 Optional 可以通过降低 NullPointerException 的风险,使代码更简洁、更健壮。

你现在已经学习了如何检查 Double 包装类对象是否为 null,如何区分 null 和零值,以及如何使用 Optional 类更安全地处理可能缺失的值。这些都是编写可靠 Java 代码的重要概念。

总结

在本次实验中,我们学习了如何检查 Java 中的 Double 包装类对象是否为 null。我们了解到,与基本数据类型 double 不同,Double 可以持有 null 值。我们演示了如何使用 == null 比较来检查 Double 变量中是否没有值,从而防止潜在的 NullPointerException 错误。我们还探讨了 Double 对象的 null 值和零值之间的区别,以及如何适当地处理这两种情况。最后,我们了解了 Optional 类,它是现代 Java 中一种更明确、更安全地处理潜在 null 值的方法。