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

Java中如何将BufferedReader读取的字符串转Integer并存入Integer列表

问题根因与修复方案

核心问题梳理

  • 终止标记判断位置错误:当前代码先对行做拆分,之后才判断当前行是否为end,会导致end字符串也被传入Integer.parseInt()触发格式异常
  • 拆分规则不合理:使用\\s做拆分仅匹配单个空白字符,当出现连续空格、制表符、前后导空白时会拆分出空字符串,空串无法转换为整数
  • 未做非法内容过滤:没有校验拆分出的字符串是否符合整数格式,遇到非数字内容直接转换必然抛异常
  • 变量命名不规范:自定义列表变量名List和Java集合接口List重名,容易引发语义混淆
  • 边界处理缺失:未处理readLine()返回null的场景(流读取到末尾时返回null),会触发空指针异常

修复后代码

public List<Integer> getIntList(BufferedReader br) {
    List<Integer> intList = new ArrayList<>();
    String line;
    try {
        while ((line = br.readLine()) != null) {
            // 优先判断终止标记,避免处理end行内容
            if ("end".equals(line.trim())) {
                return intList;
            }
            // 清除行前后导空白后,按任意长度空白拆分
            String[] arr = line.trim().split("\\s+");
            for (String s : arr) {
                // 极端场景兜底跳过空串
                if (s.isBlank()) {
                    continue;
                }
                // 校验是否为合法整数(支持负整数)
                if (s.matches("-?\\d+")) {
                    intList.add(Integer.parseInt(s));
                } else {
                    System.out.println("忽略非法整数字符串:" + s);
                }
            }
        }
    } catch (IOException e) {
        System.err.println("IO读取异常:" + e.getMessage());
    }
    return intList;
}

关键修改说明

  • 调整终止判断逻辑:读取行后优先匹配end标记,命中后直接返回结果,不再处理该行内容
  • 优化拆分规则:改用\\s+匹配任意长度的空白字符,拆分前先对整行做trim()清除前后导空白,避免生成无效空串
  • 增加合法性校验:转换前通过正则判断字符串是否为合法整数,仅合法内容才做转换,避免异常中断流程
  • 优化读取逻辑:改用br.readLine() != null作为循环判断条件,覆盖流读取到末尾的场景,避免空指针
  • 优化返回值逻辑:统一返回非空列表,避免返回null引发后续业务代码空指针

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:57:01