Java使用FileWriter追加姓名、Scanner检索时仅首个添加姓名可匹配的问题求助
检索逻辑故障修复方案
核心故障根源
verify()方法的文件遍历逻辑完全错误:每次循环只要读到第一个和输入不匹配的姓名,就立刻走else分支打印“姓名不存在”,紧接着递归调用verify()重启检索流程,根本不会继续读取文件中剩余的内容。这直接导致只有文件排在最开头的第一个姓名有机会被匹配——只要后续姓名和检索目标不一致,程序就中断当前遍历,根本读不到后面的条目,自然无法识别后续添加的姓名。- 递归调用的设计打断了完整的文件读取流程,递归触发时未走完的文件读取流会直接被丢弃,既造成资源浪费,也彻底打乱检索逻辑。
- 写入逻辑存在瑕疵:每次追加姓名前固定写入
\r\n,如果Names.txt初始为空,第一次写入会在文件开头生成多余空行,读取时可能出现内容偏移。
调整要点
- 把“读到不匹配就立刻判定不存在、重启检索”的逻辑,改成完整遍历完文件所有内容的逻辑:遍历过程中用标记位记录是否找到匹配项,只有读完所有条目后,再根据标记位输出结果,遍历中途找到匹配项就直接跳出循环即可。
- 移除循环内的无意义递归调用:不管是否找到匹配项,都在遍历完全部内容后再统一跳转回主菜单,不要在读取循环中途触发递归重启流程。
- 优化写入逻辑:文件为空时不需要提前写入换行符,避免文件开头出现多余空行干扰读取。
修正后的核心参考代码
public static void verify() throws IOException { boolean isNameExist = false; // 初始化文件读取流 Scanner textScanner = new Scanner(new File("Names.txt")); Scanner inputScanner = new Scanner(System.in); System.out.print("Enter name: "); String searchTarget = inputScanner.next().trim(); // 完整遍历文件全部内容 while (textScanner.hasNext()) { String fileContent = textScanner.next().trim(); if (fileContent.equalsIgnoreCase(searchTarget)) { isNameExist = true; break; // 匹配成功直接跳出循环,无需继续读取 } } // 遍历完成后统一输出结果 if (isNameExist) { System.out.println("This name is in the file"); } else { System.out.println("This name is not in the file"); } // 处理完成返回主菜单 menu(); }
内容的提问来源于stack exchange,提问作者user23223
相关产品推荐
相关产品推荐

