介绍
在这个实验中,你将学习如何在 Java 中检查一个 Double 对象是否为 null。我们将探讨基本数据类型 double 和 Double 包装类之间的区别,以及如何处理潜在的 NullPointerException 错误。
本实验将引导你使用相等运算符检查 null,区分 null 和零值,并利用 Optional 类进行更健壮的 null 处理。你将实现并测试代码示例,以巩固对这些概念的理解。
检查 Double 包装类是否为 null
在这一步中,我们将探讨如何在 Java 中处理 Double 包装类对象,特别关注检查 Double 变量是否为 null。与 double 等基本数据类型不同,Double 等包装类可以持有 null 值,该值表示没有值。正确处理 null 值对于防止程序中出现 NullPointerException 错误至关重要。
让我们创建一个简单的 Java 程序来演示如何检查 Double 对象是否为 null。
在 WebIDE 编辑器中打开
HelloJava.java文件。如果你还没有打开它,可以在左侧文件资源管理器的~/project目录下找到它。将
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;:我们声明了一个名为price的Double类型变量,并将其赋值为null。if (price == null):这是一个if语句,用于检查price变量是否等于null。==运算符用于比较对象的引用是否为null。System.out.println("Price is not set (it is null).");:如果price确实为null,则会执行这一行。Double quantity = 10.5;:我们声明了另一个名为quantity的Double变量,并为其赋值一个数值。- 第二个
if语句检查quantity是否为null。由于我们已经为其赋值,这个条件将为 false。
保存
HelloJava.java文件(Ctrl+S 或 Cmd+S)。现在,编译修改后的程序。打开 WebIDE 底部的终端并运行以下命令:
javac HelloJava.java如果编译成功,你将看不到任何输出。
最后,运行编译后的程序:
java HelloJava你应该会看到以下输出:
Price is not set (it is null). Quantity is set to: 10.5这个输出证实了我们的程序正确识别出
price为null,而quantity有一个值。
理解如何检查 null 是处理 Java 对象(尤其是包装类)时的基础。在下一步中,我们将探讨 null 的 Double 和值为零的 Double 之间的区别。
处理 null 值与零值
在上一步中,我们学习了如何检查 Double 包装类对象是否为 null。现在,让我们探讨 Double 为 null 和 Double 值为零(0.0)之间的区别。这种区别很重要,因为 null 表示“没有值”,而 0.0 是一个具体的数值。
设想一个场景,你正在跟踪应用于某个产品的折扣。null 折扣可能意味着折扣信息不可用,而 0.0 折扣则表示明确没有应用折扣。
让我们修改 HelloJava.java 程序来演示这种区别。
在 WebIDE 编辑器中打开
HelloJava.java文件。将现有代码替换为以下代码:
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。 - 否则,我们假设应用了一个具体的折扣值。
- 首先,我们检查变量是否为
- 我们引入了三个
保存
HelloJava.java文件。在终端中编译程序:
javac HelloJava.java运行编译后的程序:
java HelloJava你应该会看到以下输出:
Discount information is not available (it is null). --- There is no discount (value is 0.0). --- Discount applied: 5.5这个输出清晰地展示了 Java 如何区分
null的Double和值为0.0的Double。正确处理这些情况对于编写健壮的 Java 应用程序至关重要。
在下一步中,我们将探索一种更现代的方法,即使用 Optional 类来处理潜在的 null 值,这可以让你的代码更安全、更易读。
使用 Optional 类进行测试
在现代 Java(Java 8 及更高版本)中,Optional 类常被用于表示一个可能存在也可能不存在的值。与单纯使用 null 引用相比,这为处理潜在的 null 值提供了一种更明确、更安全的方式。使用 Optional 有助于防止 NullPointerException 错误,并使你的代码更易读。
让我们使用 Optional<Double> 类重写我们的折扣示例。
在 WebIDE 编辑器中打开
HelloJava.java文件。将现有代码替换为以下代码:
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.0的Optional<Double>。当你确定值不为null时,可以使用Optional.of()。Optional<Double> optionalAppliedDiscount = Optional.of(5.5);:我们创建了一个包含值5.5的Optional<Double>。optionalDiscount.isPresent():此方法用于检查Optional是否包含值。这是推荐的检查方式,而非与null进行比较。optionalDiscount.get():此方法用于从Optional中获取值。注意:如果Optional为空,调用get()会抛出NoSuchElementException。在调用get()之前,一定要先检查isPresent(),或者使用orElse()等替代方法。optionalDiscount.orElse(0.0):如果Optional中存在值,此方法将返回该值;否则,它将返回提供的默认值(在本例中为0.0)。这是一种安全的获取值并处理Optional为空情况的方式。
保存
HelloJava.java文件。在终端中编译程序:
javac HelloJava.java运行编译后的程序:
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 值的方法。



