You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现字符串每3个字符替换为X,如何避免StringIndexOutOfBoundsException?

解决字符串每第3个字符替换为X的索引越界问题

原代码问题分析

你写的代码触发StringIndexOutOfBoundsException的核心原因是:

  • 强制使用j+2作为substring的结束索引,当剩余字符不足2个时(比如字符串长度不是3的倍数,或者循环到最后一段),这个索引会超出字符串的实际长度。
  • 没有处理循环结束后剩下的不足3个字符的情况。

两种可行修改方案

方案一:逐个字符遍历(最稳妥,不易出错)

直接遍历每个字符,判断当前位置是否是第3个字符(注意索引从0开始,第3个字符的索引是2、5、8...),是则替换为X,否则保留原字符:

String ans = "";
// 这里可以替换为从键盘输入的字符串,比如用Scanner获取:
// Scanner scanner = new Scanner(System.in);
// String a = scanner.nextLine();
String a = "abcdefghijk";

for (int j = 0; j < a.length(); j++) {
    if (j % 3 == 2) {
        ans += "X";
    } else {
        ans += a.charAt(j);
    }
}

这个逻辑完全不会出现索引越界,而且能完美匹配你的需求:输入abcdefghij返回abXdeXfgXij,输入hellokit返回heXloXit。

方案二:改进分段处理逻辑

如果你想保留原有的分段思路,需要做两个关键修改:

  1. 用Math.min()确保子串的结束索引不超过字符串长度
  2. 只有当当前分段确实存在第3个字符时,才添加X
String ans = "";
String a = "abcdefghijk";
int len = a.length();

for (int j = 0; j < len; j += 3) {
    // 取从j开始最多2个字符的子串,避免索引越界
    int endIndex = Math.min(j + 2, len);
    ans += a.substring(j, endIndex);
    // 只有当当前位置后面还有第3个字符时,才添加X
    if (j + 2 < len) {
        ans += "X";
    }
}

验证示例

  • 输入abcdefghij(长度10):循环会处理j=0、3、6、9,前三次添加abX、deX、fgX,最后j=9时取ij,最终结果abXdeXfgXij
  • 输入hellokit(长度8):循环处理j=0、3、6,前两次添加heX、loX,最后j=6时取it,最终结果heXloXit

内容的提问来源于stack exchange,提问作者Nikolas Trapp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:27:25