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

为何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;
}

关键修改说明

  1. 初始化数组元素为空字符串,彻底消除null拼接的问题。
  2. 调整循环顺序:先读取行并判断是否为null,再拼接内容,最后判断终止符,避免空指针异常。
  3. 添加流读取完毕后的提前终止逻辑,防止输入不足4个"*"时生成多余的空元素。

内容的提问来源于stack exchange,提问作者owns good

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:01:06