核心目标是安全转换集合中的字符串为数字类型,避免 numberformatexception 和 classcastexception;需校验字符串格式、使用泛型约束类型、正确处理基本类型数组与 null 元素。

用集合配合包装类转换时,核心目标是避免在处理“看似数字实则非法”的数据时抛出 NumberFormatException 或 ClassCastException。关键不在于“能不能转”,而在于“怎么安全地转、转不动时怎么办”。下面从四个实际场景出发,给出可直接落地的做法。
校验字符串再转,别等异常发生
从外部(如用户输入、文件读取、HTTP参数)拿到的字符串,必须先判断是否符合数字格式,再调用 parseInt 等方法。否则一遇到 "abc"、"12.5"、null 或空格串就崩。
- 检查 null 和空白:
str == null || str.trim().isEmpty() - 整数校验正则:
str.matches("-?\d+")(支持负号) - 浮点数校验正则:
str.matches("-?\d+(\.\d+)?") - 封装工具方法,统一处理默认值:
public static Integer safeParseInt(String s, Integer fallback) {if (s == null || !s.trim().matches("-?\d+")) return fallback;try { return Integer.parseInt(s.trim()); }catch (NumberFormatException e) { return fallback; }}
集合元素类型明确,用泛型锁死
如果集合里本该全是数字字符串,却混入了其他类型(比如 ArrayList<object></object>),用 get(i) 后强制转 Integer 就容易报 ClassCastException。解决办法是:从源头约束类型。
- 声明时用具体泛型:
ArrayList<string> strList = new ArrayList();</string>,而非ArrayList原始类型 - 若需存多种类型,用 sealed class 或枚举区分,避免靠运行时 instanceof 猜类型
- 接收外部集合参数时,优先用
List.copyOf()创建不可变副本,防止中途被篡改类型
批量转换时绕过基本类型数组陷阱
常见错误:把 int[] 直接传给 Arrays.asList(),结果得到的是含单个 int[] 引用的集合,后续遍历时根本取不到数字。
- 正确做法:用包装类数组或流式转换
Integer[] boxed = Arrays.stream(primitiveArray).boxed().toArray(Integer[]::new);List<integer> list = Arrays.asList(boxed);</integer> - 更推荐流式一步到位:
List<integer> nums = Arrays.stream(strArray)</integer>.map(s -> safeParseInt(s, null)).filter(Objects::nonNull).collect(Collectors.toList());
处理 null 元素,别让拆箱成雷区
集合中若允许存 Integer,就可能有 null。一旦写 list.get(0) + 1,自动拆箱会触发 NullPointerException。
- 显式判空再操作:
Integer val = list.get(i); if (val != null) { sum += val; } - 用
Optional.ofNullable(val).orElse(0)提供兜底值 - 业务上明确语义:null 表示“无数据”还是“0”?建议统一用包装类 + 显式 null 处理,比默认值更准确











