Java中判断BufferedReader是否还有行及方法返回null问题
我来帮你梳理下问题所在,以及正确的解决方式:
问题分析与解决方案
首先,你的核心问题出在判断BufferedReader是否读到末尾的逻辑错误,导致永远无法正确返回null。我们一步步拆解:
错误点:错误的null判断方式
你写的if(out.equals(null)) return null;是完全错误的:
- 当
br.readLine()读到文件末尾时,会返回null,此时out就是null - 调用
null.equals(null)会直接抛出NullPointerException,这个判断分支根本不会执行,后续的return null逻辑永远走不到
正确的实现方式
我们需要用==来判断out是否为null,这才是正确检测流末尾的方式。同时,调整代码逻辑,确保在没有可读行时直接返回null,避免创建不必要的ClassName实例:
private ClassName foo(BufferedReader br) throws IOException { String out = br.readLine(); // 首先判断是否已经读到文件末尾 if (out == null) { return null; } // 只有当有内容可读时,才创建实例并处理 ClassName t = new ClassName(); if (!out.isEmpty()) { // 这里处理非空行的逻辑 // do something,比如给t赋值 } else { // 如果是空行,你需要返回null的话就设置t为null,或者直接return null t = null; // 执行其他无关操作 } return t; }
额外注意事项
BufferedReader.readLine()的行为:返回null表示到达流的末尾;如果是文件中的空行,会返回空字符串"",而不是null,这点要区分清楚- 确保你每次调用
foo方法时,使用的是同一个BufferedReader实例:如果每次都重新创建新的BufferedReader去读同一个文件,那每次都会从第一行开始读,这就会出现你说的“总是存储文件的第一行”的问题。如果是要多次调用逐行读取,必须复用同一个BufferedReader实例。
关于你尝试过的br.ready()方法
br.ready()只能判断流是否准备好被读取,并不能判断是否还有内容可读。比如当流暂时没有数据但还没关闭时,ready()会返回false,但之后可能还有数据;而当到达流末尾时,ready()也会返回false,但此时readLine()会返回null。所以用ready()来判断是否还有行可读是不可靠的,正确的方式还是用readLine()返回null来判断。
内容的提问来源于stack exchange,提问作者DemoVision
相关产品推荐
相关产品推荐

