实现字符串每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。
方案二:改进分段处理逻辑
如果你想保留原有的分段思路,需要做两个关键修改:
- 用
Math.min()确保子串的结束索引不超过字符串长度 - 只有当当前分段确实存在第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
相关产品推荐
相关产品推荐

