求助: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
相关产品推荐
相关产品推荐

