substring(0, 6) 是左闭右开区间,取索引0至5共6个字符;越界需提前校验长度,推荐用Math.min(6, str.length())或封装safeSubstring工具方法。

substring(0, 6) 的索引到底怎么算?
substring 是左闭右开区间,substring(0, 6) 表示从索引 0 开始(含),到索引 6 结束(不含),刚好取前 6 个字符。注意:索引从 0 开始,所以第 1 个字符是 str.charAt(0),第 6 个是 str.charAt(5)。
常见误解是以为 substring(0, 6) 会取到第 6 个位置的字符——不会,它最多取到下标 5。
- 字符串
"abc"调用substring(0, 6)会直接抛出StringIndexOutOfBoundsException -
"hello world"的长度是 11,substring(0, 6)返回"hello "(含空格) - 空字符串
""、null值必须单独判空,substring不处理null
越界时怎么避免崩溃?
不能依赖 try-catch 来兜底——性能差且掩盖逻辑问题。正确做法是提前校验长度:
- 用
str != null && str.length() >= 6判断是否够长 - 不够长时,按需返回原字符串(
str)或补足(如String.format("%-6s", str)) - 若业务允许“尽可能取”,可改用
str.substring(0, Math.min(6, str.length()))
注意:Math.min(6, str.length()) 是安全的,因为 substring(0, 0) 合法(返回空字符串),而 substring(0, str.length()) 等价于复制原串。
立即学习“Java免费学习笔记(深入)”;
Java 8+ 有没有更安全的替代写法?
public static String safeSubstring(String s, int begin, int end) {
if (s == null) return "";
int len = s.length();
int start = Math.max(0, begin);
int finish = Math.min(len, Math.max(start, end));
return s.substring(start, finish);
}
调用 safeSubstring(str, 0, 6) 就不用再每处判空和比大小。不过要注意:这个函数不处理负索引的语义(比如倒数截取),如需支持,得额外解析负值逻辑。
中文、emoji 字符会影响长度判断吗?
会,而且很关键。Java 中 String.length() 返回的是 UTF-16 代码单元数,不是 Unicode 字符数:
- 普通中文(如
"你好")每个占 1 个char,length()是 2 - 部分 emoji(如
"??")由多个 code point 组成,可能占 2~4 个char,length()可能为 4 或更多 - 所以
substring(0, 6)可能截断一个 emoji,导致显示异常(如 )或乱码
如果业务要求“按可见字符截”,得用 String.codePointCount(0, str.length()) 配合 offsetByCodePoints 手动计算边界——这不是 substring 能解决的层面了。











