string.split() 默认丢弃末尾空串易致数组越界,应通过 limit 参数控制:limit=-1 保留全部空串(如" a,b,,"→["a","b","",""]),limit>0 限制分割次数,且须始终校验数组长度再访问元素。

Java 中 String.split() 默认会丢弃末尾的空字符串,导致分割后数组长度小于预期,进而引发数组越界(如访问 result[2] 时抛 ArrayIndexOutOfBoundsException)。关键在于正确使用 limit 参数控制是否保留末尾空串。
理解 split() 的 limit 行为
split(String regex, int limit) 的 limit 参数决定分割逻辑:
-
limit > 0:最多分割
limit - 1次,剩余部分作为最后一个元素;若末尾有空串且未被分割到,则保留(包括末尾连续空串) - limit = 0(默认):等价于不限制,但丢弃所有末尾空字符串
- limit :不限制分割次数,且保留所有空字符串(含开头、中间、末尾)
用负数 limit 保留全部空串(最稳妥)
当业务需要严格按分隔符数量对齐字段(如 CSV 解析、日志字段提取),推荐设 limit = -1:
String line = "a,b,,";
String[] parts = line.split(",", -1); // 结果:["a", "b", "", ""](长度=4)这样即使末尾有多个逗号,也能确保数组长度符合“分隔符数 + 1”,避免越界。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用正数 limit 精确控制分割次数
若只需前 N 个字段,其余合并为最后一个字段,用 limit = N + 1:
String data = "name|age|city|extra|";
String[] fields = data.split("\|", 4); // 最多切3次 → ["name","age","city","extra|"]注意:此时末尾空串仍可能被丢弃,需结合实际数据判断是否足够安全。
防御性编程:始终检查数组长度
无论 limit 如何设置,运行时数据不可控。最佳实践是访问前校验:
- 用
if (parts.length > 2) { use(parts[2]); }替代直接索引 - 或用
ArrayUtils.get(parts, 2, "")(Apache Commons)提供默认值 - 对关键字段,建议封装为工具方法,内部统一处理 limit 和边界检查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










