Java调用String.charAt()抛出StringIndexOutOfBoundsException异常求解
异常产生原因
你代码里的sentence.charAt(0)本身没有问题,本次异常是循环逻辑的边界设置错误导致的,具体原因如下:
- 循环边界设置错误:Java字符串的索引范围为
0 ~ 字符串长度-1,你的for循环条件写为i <= sentence.length(),当i等于字符串长度时,调用sentence.charAt(i)就会触发越界。你测试用的"Hello World!"总长度为12,最大合法索引是11,当i取12时就抛出了提示里的索引12越界异常。 - 存在潜在边界风险:就算你把循环条件修正为
i < sentence.length(),如果输入字符串的末尾是空格,命中空格判断后执行sentence.charAt(i+1)时,i+1会等于字符串长度,同样会触发越界。
修复后的代码示例
public class Main { public static void main (String[] args) { System.out.println(generateFromSentence("Hello World!")); } public static String generateFromSentence(String sentence) { // 增加输入合法性校验,避免空字符串初始化时越界 if (sentence == null || sentence.isEmpty()) { return ""; } StringBuilder output = new StringBuilder(String.valueOf(sentence.charAt(0))); // 循环上限调整为length()-1,保证i+1不会越界 for (int i = 0; i < sentence.length() - 1; i++) { if (sentence.charAt(i) == ' '){ output.append(sentence.charAt(i+1)); } } return output.toString(); } }
修复说明:
- 新增输入非空校验,避免输入空字符串时初始化output的步骤就触发越界
- 循环上限调整为
sentence.length() - 1,既避免了i本身越界,也保证i+1始终在合法索引范围内 - 用StringBuilder代替String拼接,字符串拼接场景下性能更优
内容的提问来源于stack exchange,提问作者Loewe8
相关产品推荐
相关产品推荐

