Java FileStats类getNumLinesThatContain方法计数异常求助
FileStats类getNumLinesThatContain方法修复方案
你的代码中getNumLinesThatContain方法存在两个关键错误,导致统计结果异常:
- Scanner初始化错误:你用
new Scanner(filename)创建Scanner,这会把文件名字符串当成输入内容来读取,而非打开指定文件。所以实际只读取了一行(文件名本身),结果自然只会是0或1。 - 未处理文件异常:方法未声明抛出
FileNotFoundException,编译阶段就会报错。
此外,将Scanner作为实例字段会导致多次调用方法时的资源冲突,建议改为方法内的局部变量。
修复后的完整代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class FileStats { private final String filename; public FileStats(String f) { filename = f; } public int getNumLines() throws FileNotFoundException { int numLines = 0; // 使用局部Scanner,避免实例字段冲突 try (Scanner inputFile = new Scanner(new File(filename))) { while (inputFile.hasNextLine()) { inputFile.nextLine(); numLines++; } } return numLines; } public int getNumLinesThatContain(String key) throws FileNotFoundException { // 处理key为null的情况,避免空指针 if (key == null) { return 0; } int numLines = 0; String upperKey = key.toUpperCase(); try (Scanner inputFile = new Scanner(new File(filename))) { while (inputFile.hasNextLine()) { String line = inputFile.nextLine(); if (line.toUpperCase().contains(upperKey)) { numLines++; } } } return numLines; } }
关键修改说明
- 正确初始化Scanner:使用
new Scanner(new File(filename))打开目标文件,而非读取文件名字符串。 - 使用try-with-resources:自动关闭Scanner,避免资源泄漏,比手动调用
close()更安全。 - 提取大写关键词:提前将key转为大写,避免每次循环重复转换,提升效率。
- 空值防护:增加key为null的判断,避免
key.toUpperCase()抛出空指针异常。 - 替换实例Scanner为局部变量:避免多个方法调用时的资源冲突问题。
内容的提问来源于stack exchange,提问作者Lizzie
相关产品推荐
相关产品推荐

