如何检查 Java 数组中是否包含 null 元素

JavaJavaBeginner
立即练习

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

简介

在这个实验中,你将学习如何检查 Java 数组是否包含 null 元素。处理 null 值是 Java 编程中的一项基本技能,可防止像 NullPointerException 这样的常见错误。我们将探索三种不同的方法来实现这一目标:使用循环遍历数组、利用 Stream API 的强大功能,以及统计数组中存在的 null 元素的数量。在本实验结束时,你将掌握在 Java 数组中有效识别和管理 null 值的实用技巧。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/BasicSyntaxGroup -.-> java/for_loop("For Loop") java/DataStructuresGroup -.-> java/arrays("Arrays") java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/FileandIOManagementGroup -.-> java/stream("Stream") subgraph Lab Skills java/if_else -.-> lab-559998{{"如何检查 Java 数组中是否包含 null 元素"}} java/for_loop -.-> lab-559998{{"如何检查 Java 数组中是否包含 null 元素"}} java/arrays -.-> lab-559998{{"如何检查 Java 数组中是否包含 null 元素"}} java/arrays_methods -.-> lab-559998{{"如何检查 Java 数组中是否包含 null 元素"}} java/stream -.-> lab-559998{{"如何检查 Java 数组中是否包含 null 元素"}} end

遍历数组进行 null 检查

在这一步中,你将学习如何通过遍历 Java 数组的元素来检查其中是否存在 null 值。处理 null 值在 Java 中至关重要,可避免常见的 NullPointerException 错误。

在 Java 里,null 值表示变量不引用任何对象。当你尝试访问一个值为 null 的变量的方法或字段时,就会抛出 NullPointerException,导致程序崩溃。

下面我们创建一个简单的 Java 程序,演示如何遍历数组并检查其中的 null 元素。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。如果你还未打开该文件,可以在左侧的文件资源管理器中,于 project 文件夹内找到它。

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

    public class HelloJava {
        public static void main(String[] args) {
            String[] names = new String[5]; // Declare an array of Strings with size 5
            names[0] = "Alice";
            names[1] = "Bob";
            names[2] = null; // Assign a null value
            names[3] = "Charlie";
            names[4] = null; // Assign another null value
    
            System.out.println("Checking array for null values:");
    
            // Loop through the array
            for (int i = 0; i < names.length; i++) {
                // Check if the current element is null
                if (names[i] == null) {
                    System.out.println("Element at index " + i + " is null.");
                } else {
                    System.out.println("Element at index " + i + " is: " + names[i]);
                }
            }
        }
    }

    下面来看看这段代码的新增部分:

    • String[] names = new String[5];:这行代码声明了一个名为 names 的数组,它可以容纳 5 个 String 对象。当你创建这样的对象数组时,元素会自动初始化为 null
    • names[2] = null;names[4] = null;:我们显式地将索引 2 和 4 处的元素赋值为 null
    • for (int i = 0; i < names.length; i++):这是一个标准的 for 循环,用于从数组的第一个元素(索引 0)遍历到最后一个元素(names.length - 1)。
    • if (names[i] == null):在循环内部,这个 if 语句用于检查当前索引 i 处的元素是否等于 null
    • System.out.println("Element at index " + i + " is null.");:如果元素为 null,则执行这行代码。
    • System.out.println("Element at index " + i + " is: " + names[i]);:如果元素不为 null,则执行这行代码,打印出元素的值。
  3. 保存 HelloJava.java 文件(Ctrl+S 或 Cmd+S)。

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

    javac HelloJava.java

    如果没有错误,编译就会成功。

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

    java HelloJava

    你应该会看到类似以下的输出:

    Checking array for null values:
    Element at index 0 is: Alice
    Element at index 1 is: Bob
    Element at index 2 is null.
    Element at index 3 is: Charlie
    Element at index 4 is null.

    这个输出表明我们的程序成功识别并报告了数组中的 null 元素。

在这一步中,你学会了如何手动遍历 Java 数组,并使用简单的 if 条件检查每个元素是否为 null。这是处理潜在 NullPointerException 的基本技巧。

使用 Stream API 检测 null 值

在上一步中,我们使用传统的 for 循环来检查数组中的 null 值。Java 8 引入了 Stream API,它提供了一种更具函数式风格且通常更简洁的方式来处理数据集合,包括数组。在这一步中,你将学习如何使用 Stream API 来检测 null 元素。

Stream API 允许你以声明式的方式对元素序列执行操作。这意味着你只需描述 要做什么,而不是 如何去做(不像使用 for 循环那样)。

下面我们修改 HelloJava.java 程序,使用 Stream API 来查找并打印 null 元素。

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

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

    import java.util.Arrays; // Import the Arrays class
    import java.util.Objects; // Import the Objects class
    
    public class HelloJava {
        public static void main(String[] args) {
            String[] names = new String[5];
            names[0] = "Alice";
            names[1] = "Bob";
            names[2] = null;
            names[3] = "Charlie";
            names[4] = null;
    
            System.out.println("Checking array for null values using Stream API:");
    
            // Convert the array to a Stream
            Arrays.stream(names)
                  // Filter for null elements
                  .filter(Objects::isNull)
                  // Print each null element (or a message indicating null)
                  .forEach(name -> System.out.println("Found a null element."));
        }
    }

    下面来详细分析新增的部分:

    • import java.util.Arrays;:我们需要导入 Arrays 类,以便使用其 stream() 方法。
    • import java.util.Objects;:我们导入 Objects 类,以便使用 isNull() 方法,这是一种方便的检查对象是否为 null 的方式。
    • Arrays.stream(names):这行代码将我们的 names 数组转换为一个 String 对象的 Stream
    • .filter(Objects::isNull):这是一个中间操作。它对流进行过滤,只保留 Objects.isNull(element) 条件为真的元素(即 null 元素)。Objects::isNull 是一个方法引用,是 name -> Objects.isNull(name) 这种 lambda 表达式的简写形式。
    • .forEach(name -> System.out.println("Found a null element."));:这是一个终端操作。它对流中剩余的每个元素(即过滤后的 null 元素)执行一个操作。在这种情况下,它会为每个找到的 null 元素打印 "Found a null element."。
  3. 保存 HelloJava.java 文件。

  4. 在终端中编译程序:

    javac HelloJava.java
  5. 运行程序:

    java HelloJava

    你应该会看到类似以下的输出:

    Checking array for null values using Stream API:
    Found a null element.
    Found a null element.

    这个输出证实了 Stream API 成功识别出了数组中的两个 null 元素。对于某些操作(如过滤和处理集合),使用流可以使你的代码更具可读性和表现力。

统计 null 元素数量

在前面的步骤中,你已经学习了如何使用 for 循环和 Stream API 来识别数组中的 null 元素。有时候,你可能不仅仅是要识别 null 元素,还需要确切知道数组中到底有 多少个 null 元素。在这一步中,你将学习如何使用 Stream API 来统计 null 元素的数量。

Stream API 提供了一个方便的方法 count(),当对一个流应用该方法时,它会返回该流中元素的数量。你可以将这个方法与之前使用过的 filter() 操作结合起来,只统计 null 元素的数量。

下面我们再次修改 HelloJava.java 程序,统计 null 元素的数量并打印出总数。

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

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

    import java.util.Arrays;
    import java.util.Objects;
    
    public class HelloJava {
        public static void main(String[] args) {
            String[] names = new String[5];
            names[0] = "Alice";
            names[1] = "Bob";
            names[2] = null;
            names[3] = "Charlie";
            names[4] = null;
    
            System.out.println("Counting null values using Stream API:");
    
            // Convert the array to a Stream
            long nullCount = Arrays.stream(names)
                                  // Filter for null elements
                                  .filter(Objects::isNull)
                                  // Count the remaining elements (which are null)
                                  .count();
    
            System.out.println("Total number of null elements: " + nullCount);
        }
    }

    下面是新增的部分:

    • long nullCount = ... .count();:在对流进行过滤,使其仅包含 null 元素之后,我们调用 count() 终端操作。该操作会将过滤后流中的元素数量作为 long 类型的值返回,并将其存储在 nullCount 变量中。
    • System.out.println("Total number of null elements: " + nullCount);:这行代码打印出 null 元素的最终统计数量。
  3. 保存 HelloJava.java 文件。

  4. 在终端中编译程序:

    javac HelloJava.java
  5. 运行程序:

    java HelloJava

    你应该会看到以下输出:

    Counting null values using Stream API:
    Total number of null elements: 2

    这个输出表明我们的程序正确统计出了数组中的两个 null 元素。将 Stream API 的 filter()count() 方法结合使用,是一种高效且易读的方式,可用于统计集合中特定类型元素的数量,包括 null 值。

现在,你已经学习了三种不同的方法来处理 Java 数组中的 null 值:使用传统的 for 循环检查每个元素、使用 Stream API 过滤并识别 null 元素,以及使用 Stream API 过滤并统计 null 元素的数量。这些技术是编写健壮的 Java 代码、避免 NullPointerException 的基础。

总结

在本次实验中,你学习了如何使用不同的方法来检查 Java 数组中的 null 元素。首先,你实现了一个传统的循环来遍历数组,并使用 if 条件显式地检查每个元素是否为 null。这种方法清晰且基础,有助于你理解数组中处理 null 值的基本概念。

接着,你探索了更现代、更简洁的 null 检测技术。本实验展示了如何利用 Java Stream API 来高效地检查 null 值。这种方法利用流操作来处理数组元素,并以更具函数式风格的方式确定 null 值的存在。最后,你学习了如何统计数组中 null 元素的数量,从而能够量化 null 值的存在程度。这些方法在处理 Java 数组中的 null 值时,提供了不同程度的表达性和效率。