substring 安全使用需防越界:索引左闭右开,endindex可等于字符串长度;调用前须校验空值、索引非负且beginindex≤endindex≤length;处理emoji需用codepoint相关api。

直接用 substring 容易抛 StringIndexOutOfBoundsException,关键不是“怎么写”,而是“怎么防越界”。只要控制好索引范围,它本身就很安全。
明确两个参数的真实含义
substring 不是“第几个到第几个字符”,而是按 索引位置 切片,且区间为左闭右开:
-
beginIndex:要保留的第一个字符的位置(含) -
endIndex:第一个不保留字符的位置(不含) - 结果长度恒等于
endIndex - beginIndex -
endIndex可以等于字符串长度,此时等价于只传beginIndex
避免越界的三步检查法
别依赖“用户输入一定合规”,每次调用前手动校验更可靠:
- 先判空或 null:
if (str == null || str.isEmpty()) return ""; - 确保
beginIndex >= 0且beginIndex - 确保
endIndex >= beginIndex且endIndex
常用简化写法:int end = Math.min(begin + len, str.length());,再调用 substring(begin, end)。
按内容定位时的典型安全写法
想截取某个分隔符前/后的部分,别直接套索引——indexOf 返回 -1 时必须处理:
- 取
"abc@def.com"中@前的部分:int idx = str.indexOf('@'); return idx == -1 ? str : str.substring(0, idx); - 取
@后的部分:int idx = str.indexOf('@'); return idx == -1 ? "" : str.substring(idx + 1); - 想取最后 3 个字符:
return str.length() >= 3 ? str.substring(str.length() - 3) : str;
注意中文和 emoji 的“视觉错位”
substring 按 char 索引操作,不是按“人眼字符”。一个 emoji(如 ?)在 Java 中占 2 个 char(代理对),直接切可能得到乱码:
- 日常 ASCII 或纯中文文本基本没问题
- 若需按“用户看到的字符”截取,改用
str.offsetByCodePoints(0, n)配合substring - 简单判断是否含 emoji:
str.codePointCount(0, str.length()) != str.length()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











