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

求助:BufferedReader读取文件时因循环条件错误触发NullPointerException

问题分析与解决方案

你的代码触发NullPointerException的核心原因是循环条件的逻辑错误:

while (ln != null || ln.length() != 0)

这里误用了逻辑或||:当BufferedReader读到文件末尾时,br.readLine()会返回null,此时ln != null为false,但逻辑或会继续执行第二个条件ln.length() != 0——而ln已经是null,调用length()方法必然抛出空指针异常。

同时这个逻辑也不符合你的需求:你想跳过null(文件结束)和空白行,但||的逻辑是"只要不是null或者不是空白行就循环",这会导致空白行也被纳入循环,和预期相反。

修正后的代码

1. 修复循环逻辑

把逻辑或||改成逻辑与&&,利用短路特性先判断ln != null(避免空指针),同时如果要过滤全空格的空白行,用trim()或isBlank()(Java 11+)判断:

public ReadFile(String filename) {
    try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
        String ln = br.readLine();
        // 循环条件:行不为null,且不是空白行(包括全空格)
        while (ln != null && !ln.trim().isEmpty()) {
            // 处理ln
            // 示例处理逻辑:打印行内容
            System.out.println("处理行:" + ln);
            // 读取下一行
            ln = br.readLine();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

2. 优化资源管理

上面的代码使用了try-with-resources语法,无需手动调用br.close(),JVM会自动关闭资源,避免了异常场景下的资源泄漏问题。

为什么另一个文件运行正常?

另一个文件大概率是末尾存在空白字符串行(而非直接到文件结束返回null):当读取到空白行时,ln != null为true,ln.length() != 0为false,逻辑或||的结果为true会进入循环,但处理完后读取下一行得到null时,循环条件判断本应触发空指针,但可能该文件的空白行之后没有更多内容,或者你的处理逻辑在该场景下提前结束,暂时掩盖了代码的逻辑缺陷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:28