使用BufferedReader读取文件时,如何判断行非空并避免空指针异常?
解决BufferedReader读取空行引发空指针异常的问题
嘿,我完全懂你踩的这个坑——用BufferedReader读文件时,空行或者全是空白字符的行,再加上没处理好null的情况,很容易让trim()触发空指针异常。毕竟当文件读到末尾时,readLine()会返回null,这时候直接调用trim()肯定炸。下面给你几个实用的解决思路:
基础方案:先判null,再trim+判空
这是最稳妥且不需要额外依赖的方法,核心是两步判断:
- 先检查
readLine()的返回值是否为null(避免文件读完后触发空指针) - 对非null的行,调用
trim()后判断是否为空字符串(跳过全空白的行)
示例代码如下:
String line; // 用try-with-resources自动关闭流,避免资源泄漏 try (BufferedReader br = new BufferedReader(new FileReader("your-file-path.txt"))) { // 循环读取每一行,直到readLine()返回null while ((line = br.readLine()) != null) { String trimmedLine = line.trim(); // 只处理trim后非空的行 if (!trimmedLine.isEmpty()) { // 这里写你的业务逻辑,比如教授要求的处理操作 processLine(trimmedLine); } } } catch (IOException e) { // 异常处理,比如打印日志或抛出自定义异常 e.printStackTrace(); }
这个方案能完美跳过两种“无效行”:
- 文件末尾的null值
- 原行是全空白(空格、制表符、换行符等)的情况,trim后变成空字符串
进阶方案:用工具类简化判断(如果有依赖的话)
如果你项目里已经引入了Apache Commons Lang库,那可以用StringUtils.isNotBlank()方法,它会一次性帮你处理null、空字符串、全空白字符串的情况,代码更简洁:
String line; try (BufferedReader br = new BufferedReader(new FileReader("your-file-path.txt"))) { while ((line = br.readLine()) != null) { if (StringUtils.isNotBlank(line)) { String trimmedLine = line.trim(); // 处理有效行 processLine(trimmedLine); } } } catch (IOException e) { e.printStackTrace(); }
不过如果不想为了这一个功能引入第三方依赖,基础方案就足够好用了。
关键注意事项
- 顺序不能乱:一定要先判断
line != null,再调用trim()——null调用任何方法都会抛出空指针异常,这是你当前问题的核心原因。 - 区分空行和空白行:如果只是想跳过完全没有字符的空行(
readLine()返回""),那可以在trim前判断,但通常我们需要跳过的是所有包含空白字符的行,所以trim后判断isEmpty()更准确。
内容的提问来源于stack exchange,提问作者bmurf17
相关产品推荐
相关产品推荐

