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

