求助排查java.lang.StringIndexOutOfBoundsException异常原因
解决StringIndexOutOfBoundsException: String index out of range: 7的问题
嘿,我来帮你揪出这个索引越界的问题!你遇到的java.lang.StringIndexOutOfBoundsException是因为代码里的递归逻辑有两个小问题,直接导致了访问超出字符串范围的索引。
问题根源分析
先看你代码里的递归触发条件:
if (index < input.length()) { luckySevens(input, index+1, sevens); }
假设你的字符串长度是7,有效索引范围是0~6。当递归到index=6时,6 < 7的条件成立,于是会调用luckySevens(input, 7, sevens)。而在这个新的递归调用里,第一行就执行input.charAt(7)——这显然超出了字符串的最大索引6,直接抛出了你看到的异常。
另外还有一个隐藏的逻辑错误:你调用递归后没有返回它的结果,导致递归过程中更新的sevens值根本不会传递回上层调用,最终返回的还是初始的sevens值,这会让你的计数逻辑完全失效。
修复后的代码
把逻辑调整一下,先做越界判断,再处理字符,并且正确返回递归结果:
public class LuckySeven { public int luckySevens(String input, int index, int sevens) { // 先判断索引是否越界,越界直接返回当前结果 if (index >= input.length()) { return sevens; } int curDigit = input.charAt(index) - 48; if (curDigit == 7) { if (index > 0 && (input.charAt(index - 1) - 48) == 7) { sevens += 14; } else { sevens++; } } // 递归处理下一个索引,并返回递归结果 return luckySevens(input, index + 1, sevens); } }
修复说明
- 越界防护:在方法最开头添加
if (index >= input.length())判断,一旦索引超出有效范围,直接返回当前的sevens值,避免执行后续的charAt操作。 - 正确传递递归结果:把原来的无返回递归调用改成
return luckySevens(...),这样递归过程中更新的sevens值会逐层传递回上层调用,保证计数结果正确。
这样修改后,不仅能解决索引越界的问题,还能让你的幸运数字7的计数逻辑正常工作。
内容的提问来源于stack exchange,提问作者Addymeister
相关产品推荐
相关产品推荐

