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

JavaJavaBeginner
立即练习

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

简介

在这个实验中,你将学习如何在 Java 中安全地检查 Boolean 包装类对象是否为 null。与基本数据类型 boolean 不同,Boolean 类可以持有 null 值,如果处理不当,可能会导致 NullPointerException

我们将探讨处理 null Boolean 对象的不同技术,包括直接进行空值检查、结合空值和真假检查,以及使用 Optional 类进行更健壮的空值处理。在本实验结束时,你将能够避免在处理 Java 中的 Boolean 包装类对象时遇到的常见陷阱。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/booleans("Booleans") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/booleans -.-> lab-559932{{"如何在 Java 中检查布尔对象是否为 null"}} java/variables -.-> lab-559932{{"如何在 Java 中检查布尔对象是否为 null"}} java/if_else -.-> lab-559932{{"如何在 Java 中检查布尔对象是否为 null"}} java/object_methods -.-> lab-559932{{"如何在 Java 中检查布尔对象是否为 null"}} end

测试 Boolean 包装类是否为 Null

在这一步中,我们将探讨如何在 Java 中处理 Boolean 包装类对象,特别关注如何检查一个 Boolean 对象是否为 null。与只能为 truefalse 的基本数据类型 boolean 不同,Boolean 包装类还可以持有 null 值。如果处理不当,这通常会导致 NullPointerException

让我们创建一个简单的 Java 程序来演示这一点。

  1. 在 WebIDE 左侧的文件资源管理器中打开 ~/project 目录。

  2. ~/project 目录的空白处右键单击,然后选择“新建文件”。

  3. 将新文件命名为 BooleanCheck.java 并按回车键。

  4. 在代码编辑器中打开 BooleanCheck.java 文件。

  5. 将以下 Java 代码复制并粘贴到编辑器中:

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean myBoolean = null;
    
            // 尝试在条件语句中直接使用 null 的 Boolean
            // 会导致 NullPointerException
            // if (myBoolean) {
            //     System.out.println("This will not be printed if myBoolean is null.");
            // }
    
            // 检查 Boolean 包装类是否为 null 的正确方法
            if (myBoolean == null) {
                System.out.println("myBoolean is null.");
            } else {
                System.out.println("myBoolean is not null.");
            }
    
            // 另一种安全检查布尔值的方法
            if (Boolean.TRUE.equals(myBoolean)) {
                 System.out.println("myBoolean is true.");
            } else if (Boolean.FALSE.equals(myBoolean)) {
                 System.out.println("myBoolean is false.");
            } else {
                 System.out.println("myBoolean is null (checked using equals).");
            }
        }
    }
  6. Ctrl + S(在 Mac 上按 Cmd + S)保存文件。

  7. 现在,让我们编译这个 Java 程序。打开 WebIDE 底部的终端。确保你位于 ~/project 目录中。如果不是,请输入 cd ~/project 并按回车键。

  8. 使用 javac 命令编译代码:

    javac BooleanCheck.java

    如果没有错误,该命令将执行完毕且无输出。这意味着 ~/project 目录中已创建了一个 BooleanCheck.class 文件。

  9. 使用 java 命令运行编译后的 Java 程序:

    java BooleanCheck
  10. 你应该会在终端中看到以下输出:

    myBoolean is null.
    myBoolean is null (checked using equals).

这个输出证实了我们的代码使用 == null 检查和 Boolean.TRUE.equals() / Boolean.FALSE.equals() 模式正确地识别出 Boolean 对象为 null。注释掉的代码展示了如果你尝试在 if 条件语句中直接使用 nullBoolean 会发生什么,这将导致 NullPointerException

理解如何安全地处理 nullBoolean 对象对于避免 Java 编程中的常见错误至关重要。

结合空值和真假检查

在上一步中,我们了解了如何检查一个 Boolean 对象是否为 null。通常,你需要检查一个 Boolean 值是 truefalse 还是 null。高效且安全地结合这些检查非常重要。

让我们修改 BooleanCheck.java 程序,以演示如何处理这三种可能性。

  1. 如果 BooleanCheck.java 文件尚未在代码编辑器中打开,请打开它。该文件应位于 ~/project 目录中。

  2. BooleanCheck.java 中的现有代码替换为以下代码。此版本包含了 nulltruefalse 三种 Boolean 值的示例。

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean booleanValue1 = null;
            Boolean booleanValue2 = true;
            Boolean booleanValue3 = false;
    
            System.out.println("Checking booleanValue1 (null):");
            checkBoolean(booleanValue1);
    
            System.out.println("\nChecking booleanValue2 (true):");
            checkBoolean(booleanValue2);
    
            System.out.println("\nChecking booleanValue3 (false):");
            checkBoolean(booleanValue3);
        }
    
        // 一个辅助方法,用于演示检查过程
        public static void checkBoolean(Boolean value) {
            if (value == null) {
                System.out.println("Value is null.");
            } else if (value) { // 这里是安全的,因为我们已经检查过是否为 null
                System.out.println("Value is true.");
            } else { // 如果不是 null 且不是 true,那必然是 false
                System.out.println("Value is false.");
            }
    
            // 另一种常用的安全检查模式,使用 equals 方法
            System.out.print("Using equals: ");
            if (Boolean.TRUE.equals(value)) {
                 System.out.println("Value is true.");
            } else if (Boolean.FALSE.equals(value)) {
                 System.out.println("Value is false.");
            } else {
                 System.out.println("Value is null.");
            }
        }
    }

    在这段更新后的代码中:

    • 我们定义了一个辅助方法 checkBoolean,它接受一个 Boolean 对象作为输入。
    • checkBoolean 方法内部,我们首先使用 value == null 检查 value 是否为 null
    • 如果不是 null,我们再使用 value 安全地检查布尔值是否为 true。这是可行的,因为只有当包装类不是 null 时,Java 才会将 Boolean 包装类自动拆箱为基本数据类型 boolean
    • 如果不是 null 且不是 true,那么它必然是 false,这在 else 块中进行处理。
    • 我们还再次使用了 Boolean.TRUE.equals(value)Boolean.FALSE.equals(value) 模式,这是另一种安全检查值的方式,尤其在你想避免调用 equals 方法的对象为 null 时可能出现的 NullPointerException 时非常有用。
  3. 保存文件(按 Ctrl + SCmd + S)。

  4. 在终端中编译修改后的程序:

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

    java BooleanCheck
  6. 你应该会看到以下输出,展示了代码如何处理每种情况:

    Checking booleanValue1 (null):
    Value is null.
    Using equals: Value is null.
    
    Checking booleanValue2 (true):
    Value is true.
    Using equals: Value is true.
    
    Checking booleanValue3 (false):
    Value is false.
    Using equals: Value is false.

这一步向你展示了检查 Boolean 包装类对象状态的可靠方法,考虑了 nulltruefalse 值,这是编写安全可靠的 Java 代码的一项基本技能。

使用 Optional 类进行处理

在现代 Java(Java 8 及更高版本)中,Optional 类常被用于表示一个可能存在或不存在的值。通过明确指出值可能缺失的情况,这有助于减少代码中 NullPointerException 的出现。虽然 Optional<Boolean> 并非最常见的使用场景,但它是理解如何将 Optional 应用于像 Boolean 这样的包装类型的一个很好的示例。

在这一步中,我们将修改程序,使用 Optional<Boolean> 来处理布尔值可能缺失的情况。

  1. 在代码编辑器中打开 BooleanCheck.java 文件。该文件应位于 ~/project 目录中。

  2. 将现有代码替换为以下使用 Optional<Boolean> 的代码:

    import java.util.Optional;
    
    public class BooleanCheck {
    
        public static void main(String[] args) {
            Optional<Boolean> optionalBoolean1 = Optional.empty(); // 表示没有值
            Optional<Boolean> optionalBoolean2 = Optional.of(true); // 表示值为 true
            Optional<Boolean> optionalBoolean3 = Optional.of(false); // 表示值为 false
    
            System.out.println("Checking optionalBoolean1 (empty):");
            checkOptionalBoolean(optionalBoolean1);
    
            System.out.println("\nChecking optionalBoolean2 (true):");
            checkOptionalBoolean(optionalBoolean2);
    
            System.out.println("\nChecking optionalBoolean3 (false):");
            checkOptionalBoolean(optionalBoolean3);
        }
    
        // 一个辅助方法,用于演示检查 Optional<Boolean> 的过程
        public static void checkOptionalBoolean(Optional<Boolean> optionalValue) {
            if (optionalValue.isPresent()) {
                // 如果值存在,则获取该布尔值
                Boolean value = optionalValue.get();
                if (value) {
                    System.out.println("Value is present and true.");
                } else {
                    System.out.println("Value is present and false.");
                }
            } else {
                System.out.println("Value is not present (empty Optional).");
            }
    
            // 另一种使用 orElse 的方式
            System.out.print("Using orElse(false): ");
            boolean result = optionalValue.orElse(false);
            System.out.println("Result: " + result);
    
            // 使用 ifPresent
            System.out.print("Using ifPresent: ");
            optionalValue.ifPresent(val -> System.out.println("Value is present: " + val));
            if (!optionalValue.isPresent()) {
                 System.out.println("Value is not present.");
            }
        }
    }

    在这个版本中:

    • 我们导入了 java.util.Optional 类。
    • 我们使用 Optional.empty() 来创建表示缺失值的 Optional<Boolean> 对象,使用 Optional.of() 来创建表示存在值的 Optional<Boolean> 对象。
    • checkOptionalBoolean 方法现在接受一个 Optional<Boolean> 类型的参数。
    • 我们使用 optionalValue.isPresent() 来检查值是否存在。
    • 如果值存在,我们使用 optionalValue.get() 来获取它。注意:只有在检查了 isPresent() 之后才能调用 get(),否则会抛出 NoSuchElementException
    • 我们还演示了 orElse(false) 的用法,当 Optional 为空时,它会提供一个默认值(在这种情况下为 false)。
    • ifPresent() 允许你仅在值存在时执行操作。
  3. 保存文件(按 Ctrl + SCmd + S)。

  4. 在终端中编译修改后的程序:

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

    java BooleanCheck
  6. 你应该会看到以下输出:

    Checking optionalBoolean1 (empty):
    Value is not present (empty Optional).
    Using orElse(false): Result: false
    Using ifPresent: Value is not present.
    
    Checking optionalBoolean2 (true):
    Value is present and true.
    Using orElse(false): Result: true
    Using ifPresent: Value is present: true
    
    Checking optionalBoolean3 (false):
    Value is present and false.
    Using orElse(false): Result: false
    Using ifPresent: Value is present: false

这个输出展示了如何使用 Optional<Boolean> 来明确处理布尔值的存在或缺失情况,与仅使用可空的 Boolean 相比,它提供了一种更健壮的方式来处理可能缺失的数据。

总结

在本次实验中,我们学习了如何在 Java 中检查 Boolean 包装类对象是否为 null。我们探讨了基本数据类型 booleanBoolean 包装类之间的区别,强调了在处理 nullBoolean 对象时可能会出现 NullPointerException 的情况。我们演示了使用相等运算符 (== null) 来检查 null 的正确方法,还展示了如何使用 Boolean.TRUEBoolean.FALSEequals() 方法来安全地检查布尔值。在处理可空的 Boolean 对象时,这些技术对于防止运行时错误至关重要。