为何BufferedReader相关代码首行输出null?求原因与修复方法
问题原因
- 数组元素初始值为null:
String[] weeks = new String[4];创建的数组中每个元素默认是null,第一次执行weeks[i] = weeks[i] + row + "\n"时,null会被自动转为字符串"null",和后续内容拼接就出现了首行的"null"。 - 逻辑顺序错误:先拼接再判断终止条件,导致即使
row是null或者"*",也会被拼接到结果里,还可能引发空指针异常(当row为null时调用row.equals("*"))。
修复方案
基础修复版
修改代码如下,解决null问题并优化逻辑:
public static String[] splitWeeks(String t)throws IOException { String[] weeks = new String[4]; // 初始化每个元素为空字符串,避免null参与拼接 for (int i = 0; i < weeks.length; i++) { weeks[i] = ""; } BufferedReader instream = new BufferedReader(new StringReader(t)); for(int i = 0; i < 4; i++) { String row; while ((row = instream.readLine()) != null) { weeks[i] += row + "\n"; // 遇到"*"就停止当前周的读取 if (row.equals("*")) { break; } } // 流读完就提前终止,避免生成多余空元素 if (row == null) { break; } } return weeks; }
性能优化版(推荐)
如果处理的字符串较长,用StringBuilder代替字符串拼接,提升效率:
public static String[] splitWeeks(String t)throws IOException { String[] weeks = new String[4]; BufferedReader instream = new BufferedReader(new StringReader(t)); for(int i = 0; i < 4; i++) { StringBuilder sb = new StringBuilder(); String row; while ((row = instream.readLine()) != null) { sb.append(row).append("\n"); if (row.equals("*")) { break; } } weeks[i] = sb.toString(); if (row == null) { break; } } return weeks; }
关键修改说明
- 初始化数组元素为空字符串,彻底消除
null拼接的问题。 - 调整循环顺序:先读取行并判断是否为
null,再拼接内容,最后判断终止符,避免空指针异常。 - 添加流读取完毕后的提前终止逻辑,防止输入不足4个"*"时生成多余的空元素。
内容的提问来源于stack exchange,提问作者owns good
相关产品推荐
相关产品推荐

