简介
在这个实验中,你将学习如何在 Java 中检查一个 Double
对象是否为 null。我们将探讨基本数据类型 double
和 Double
包装类之间的区别,以及如何处理潜在的 NullPointerException
错误。
本实验将引导你使用相等运算符检查 null,区分 null 和零值,并利用 Optional
类进行更健壮的 null 处理。你将实现并测试代码示例,以巩固对这些概念的理解。
在这个实验中,你将学习如何在 Java 中检查一个 Double
对象是否为 null。我们将探讨基本数据类型 double
和 Double
包装类之间的区别,以及如何处理潜在的 NullPointerException
错误。
本实验将引导你使用相等运算符检查 null,区分 null 和零值,并利用 Optional
类进行更健壮的 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
之间的区别。
在上一步中,我们学习了如何检查 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
值,这可以让你的代码更安全、更易读。
在现代 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
值的方法。