You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

填充固定长度数组时如何实现重复检查?空数组报错求解

问题

在实现长度为5的Guardian数组填充时遇到重复检查的难题:数组初始为空(所有元素为null),添加元素前需要检查是否已存在,但直接调用equals方法与null比较会触发空指针错误。

期望实现的逻辑:

  1. 先检查数组是否未达容量上限
  2. 验证待添加元素是否重复
  3. 若无重复则添加元素;若有重复则提示且不添加

以下是项目中的代码片段:

public class Collections {
    Guardian[] guardians;
    int count;
    
    final static int MAX_GUARDIANS = 5;

    public Collections() { // 原代码构造方法名与类名不一致,已修正
        guardians = new Guardian[MAX_GUARDIANS];
    }

    public void addGuardians(Guardian guardian) {
        if (this.count < MAX_GUARDIANS) {
            for (int i = 0; i < guardians.length; i++) {
                if (guardians[i].equals(guardian)) {
                    System.out.println("The guardian is already in the list!");
                } else {
                    this.guardians[this.count++] = guardian;
                    System.out.println("Guardian " + guardian.getName() + " was added to the list!");
                }
            }
        } else {
            System.out.println("Maximum number of guardians in the list has been reached!");
        }
    }
}

请问能否将待添加元素与null进行比较?


回答

关于与null比较的问题

当然可以将待添加元素与null比较,但绝对不能直接调用null对象的equals方法——这正是你触发空指针错误的核心原因。比如guardians[i].equals(guardian)中,如果guardians[i]是null,调用它的equals方法会直接抛出NullPointerException。

安全的比较方式有两种:

  1. 先判断guardians[i]不为null,再调用equals:
    if (guardians[i] != null && guardians[i].equals(guardian))
    
  2. 使用Objects.equals()工具方法(Java 7+),它会自动处理null的情况:
    if (Objects.equals(guardians[i], guardian))
    

原代码的其他逻辑问题

除了空指针问题,你的代码还有两处核心逻辑错误:

  1. 遍历范围错误:你遍历了整个数组的长度(i < guardians.length),但实际上只需要遍历已添加的元素(i < count),否则会重复添加同一个元素多次。
  2. 重复检查逻辑错误:你只要遇到第一个不相等的元素就执行添加操作,而应该遍历完所有已添加元素,确认没有重复后再添加。

修正后的代码

import java.util.Objects;

public class Collections {
    Guardian[] guardians;
    int count;
    
    final static int MAX_GUARDIANS = 5;

    public Collections() {
        guardians = new Guardian[MAX_GUARDIANS];
    }

    public void addGuardians(Guardian guardian) {
        // 先检查容量是否已满
        if (this.count >= MAX_GUARDIANS) {
            System.out.println("Maximum number of guardians in the list has been reached!");
            return;
        }

        // 检查待添加元素是否为null
        if (guardian == null) {
            System.out.println("Guardian cannot be null!");
            return;
        }

        // 检查是否重复
        boolean isDuplicate = false;
        for (int i = 0; i < count; i++) { // 只遍历已添加的元素
            if (Objects.equals(guardians[i], guardian)) {
                isDuplicate = true;
                break;
            }
        }

        if (isDuplicate) {
            System.out.println("The guardian is already in the list!");
        } else {
            this.guardians[this.count++] = guardian;
            System.out.println("Guardian " + guardian.getName() + " was added to the list!");
        }
    }
}

额外说明

  • 确保Guardian类正确重写了equals()方法,否则默认的equals只会比较对象引用,无法判断逻辑上的重复。

内容的提问来源于stack exchange,提问作者User617290653251457439

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:50:27