填充固定长度数组时如何实现重复检查?空数组报错求解
问题
在实现长度为5的Guardian数组填充时遇到重复检查的难题:数组初始为空(所有元素为null),添加元素前需要检查是否已存在,但直接调用equals方法与null比较会触发空指针错误。
期望实现的逻辑:
- 先检查数组是否未达容量上限
- 验证待添加元素是否重复
- 若无重复则添加元素;若有重复则提示且不添加
以下是项目中的代码片段:
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。
安全的比较方式有两种:
- 先判断
guardians[i]不为null,再调用equals:if (guardians[i] != null && guardians[i].equals(guardian)) - 使用
Objects.equals()工具方法(Java 7+),它会自动处理null的情况:if (Objects.equals(guardians[i], guardian))
原代码的其他逻辑问题
除了空指针问题,你的代码还有两处核心逻辑错误:
- 遍历范围错误:你遍历了整个数组的长度(
i < guardians.length),但实际上只需要遍历已添加的元素(i < count),否则会重复添加同一个元素多次。 - 重复检查逻辑错误:你只要遇到第一个不相等的元素就执行添加操作,而应该遍历完所有已添加元素,确认没有重复后再添加。
修正后的代码
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
相关产品推荐
相关产品推荐

