1. 方法签名

substring() 方法提供两种重载形式:

  • 单参数形式:仅指定起始索引,截取到字符串末尾
  • 双参数形式:指定起始索引和结束索引,截取两者之间的子串
public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)

2. 使用示例

⚠️ 注意:结束索引是不包含的(左闭右开区间)

@Test
public void whenCallSubstring_thenCorrect() {
    String s = "Welcome to Baeldung";
    
    // 截取 [0,7) 区间的字符
    assertEquals("Welcome", s.substring(0, 7));
}

3. 异常处理

❌ 当出现以下情况时抛出 IndexOutOfBoundsException

  • 起始索引为负数
  • 起始索引大于结束索引
  • 结束索引超过字符串长度
@Test(expected = IndexOutOfBoundsException.class)
public void whenSecondIndexEqualToLengthOfString_thenCorrect() {
    String s = "Welcome to Baeldung";
    
    // 字符串长度仅17,却尝试截取到20
    String sub = s.substring(0, 20);
}

4. 关键要点

  • 📌 单参数形式等价于 substring(beginIndex, length())
  • 📌 原字符串不会被修改(String不可变)
  • 📌 结束索引最大值 = 字符串长度(不会报错)
  • 📌 空字符串截取会返回空字符串而非null

💡 踩坑提醒:新手常误以为结束索引是包含的,导致截取结果多一个字符。建议用 s.substring(0, s.length()) 获取完整字符串而非直接用原变量。