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

Java通讯录搜索功能异常:已录入记录无法被检索的问题排查

问题原因分析及解决方法

常见原因及对应解决方案:

  • 字符串匹配时存在空格干扰
    录入或搜索时,手机号前后可能带有空格,导致equals匹配失败。
    解决:存储和搜索前都对手机号执行trim()处理,去除前后空白字符:

    // 录入时处理
    String inputPhone = scanner.nextLine().trim();
    newContact.setPhoneNumber(inputPhone);
    // 搜索时处理
    String searchPhone = scanner.nextLine().trim();
    
  • 手机号格式不统一
    录入时存储了带格式的号码(如+86138xxxx1234或138-xxxx-1234),但搜索时输入纯数字,导致匹配失败。
    解决:统一只保留数字字符,存储和搜索前都做格式化处理:

    // 格式化手机号,仅保留数字
    private String formatPhone(String phone) {
        return phone.trim().replaceAll("[^0-9]", "");
    }
    // 录入和搜索时调用该方法
    String formattedPhone = formatPhone(inputPhone);
    
  • 字符串匹配用了==而非equals()
    Java中==比较的是字符串对象的内存地址,而非内容,用它匹配手机号必然失败。
    解决:遍历集合时用equals()比较手机号内容:

    boolean found = false;
    for (AddressBook contact : addressBookList) {
        if (contact.getPhoneNumber().equals(searchPhone)) {
            // 找到记录,处理逻辑
            found = true;
            break;
        }
    }
    
  • Scanner输入读取异常
    如果在搜索前用了nextInt()读取菜单选项,后续的nextLine()会读取到空行(因为nextInt()不会消费回车符),导致搜索的手机号为空。
    解决:读取菜单选项后,额外调用一次nextLine()消费回车符:

    System.out.print("Enter choice: ");
    int choice = scanner.nextInt();
    scanner.nextLine(); // 消费掉回车符
    // 然后读取搜索手机号
    String searchPhone = scanner.nextLine().trim();
    
  • AddressBook类未重写equals方法(若用集合contains方法)
    如果你的搜索逻辑用了addressBookList.contains(targetContact),而AddressBook未重写equals,会默认比较对象内存地址,无法匹配到目标记录。
    解决:在AddressBook类中重写equals和hashCode方法,基于手机号判断相等:

    import java.util.Objects;
    
    public class AddressBook {
        private String phoneNumber;
        // 其他字段、getter、setter
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            AddressBook that = (AddressBook) o;
            return Objects.equals(phoneNumber, that.phoneNumber);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(phoneNumber);
        }
    }
    
  • 录入时手机号未正确存储
    检查录入模块的代码,确认手机号确实被赋值给了AddressBook对象的phoneNumber字段,避免出现字段赋值错误(比如把姓名赋值给了手机号)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:43:11