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
相关产品推荐
相关产品推荐

