如何实现Scanner输入匹配文本文件行并修复代码逻辑问题?
问题分析与修复方案
我来帮你看看这段代码的问题在哪——确实,你的逻辑里有几个关键的小错误,导致if/else完全没按预期工作:
核心问题点
- 未循环更新待判断的行:你只在循环外读取了文件的第一行
fileScanner.nextLine()到fileScannerLine,之后循环里一直用这一行来判断,根本没去读文件的其他内容。 - 读取行的逻辑混乱:循环里的
fileScanner.nextLine()会跳过当前行去读下一行,不管匹配与否都会打乱行的遍历顺序,甚至不匹配时会陷入死循环(因为没读取新行,hasNext()一直为true)。 - 错误提示时机不对:现在每一行不匹配就立刻输出错误,而应该是遍历完所有行都没找到匹配项时,才提示用户输入无效。
- 大小写匹配不一致:你把输入转成了小写,但文件里的行没有转小写,会导致大小写不同时匹配失败(比如文件里是
Inception,输入inception就匹配不到)。
修复后的代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class FilmFinder { public static void main(String[] args) { Scanner editScanner = new Scanner(System.in); System.out.print("请输入要查找的电影名称:"); // 把输入转成小写,统一匹配规则 String target = editScanner.nextLine().toLowerCase(); editScanner.close(); boolean filmFound = false; // 使用try-with-resources自动关闭文件扫描器,避免资源泄漏 try (Scanner fileScanner = new Scanner(new File("src/FilmInfo.dat"))) { // 遍历文件的每一行 while (fileScanner.hasNextLine()) { String currentLine = fileScanner.nextLine(); // 把行内容也转成小写,实现大小写不敏感匹配 if (currentLine.toLowerCase().contains(target)) { System.out.println("找到匹配的电影:" + currentLine); filmFound = true; // 如果只需要找第一个匹配项,可以在这里加break; } } // 遍历完所有行后,再判断是否找到 if (!filmFound) { System.out.println("Film name is not recognised in your collection, please enter a film name that is in your collection."); } } catch (FileNotFoundException e) { System.out.println("找不到文件src/FilmInfo.dat,请检查路径是否正确。"); e.printStackTrace(); } } }
关键改动说明
- 统一大小写匹配:把输入和文件行都转成小写,确保匹配不受大小写影响。
- 逐行遍历逻辑:在循环内每次读取一行
currentLine,确保每一行都被判断到。 - 添加找到标志位:用
filmFound记录是否找到匹配项,遍历结束后再决定是否输出错误提示,避免频繁弹出错误。 - 资源自动管理:用
try-with-resources创建文件扫描器,程序结束时会自动关闭,避免资源泄漏。 - 异常处理:捕获
FileNotFoundException,处理文件不存在的情况,让程序更健壮。
内容的提问来源于stack exchange,提问作者marrimred99
相关产品推荐
相关产品推荐

