Java中ArrayIndexOutOfBoundsException异常排查:StringInString方法分析
排查并修正Java子串统计代码的数组越界异常
首先咱们来拆解一下你这段代码抛出java.lang.ArrayIndexOutOfBoundsException的原因,再一步步修正:
异常根源分析
- 循环边界不严谨:外层循环
while(i<x)没有考虑子串的长度,当i的值加上子串长度y已经大于原字符串长度x时,根本不可能再匹配到子串,但代码还会继续循环,后续访问onee[i]时就会超出字符数组的索引范围(数组索引是从0到x-1)。 - 匹配失败后的逻辑错误:内层循环中,当匹配失败且
j≠0时,直接让i++并重置j=0,这不仅会漏掉一些重叠匹配的场景,还可能导致i被不合理地递增到超过x-1的位置,触发java.lang.ArrayIndexOutOfBoundsException。 - main方法代码不完整:原代码里的
System.out.printl...是语法错误,应该补全为System.out.println(sum);
修正后的代码
public class SubstringCounter { public static int StringInString(String one, String two) { // 空值与空字符串校验 if (one == null || two == null || one.isEmpty() || two.isEmpty()) { return 0; } int originalLength = one.length(); int subLength = two.length(); // 子串比原字符串长,直接返回0 if (subLength > originalLength) { return 0; } int count = 0; int i = 0; char[] originalChars = one.toCharArray(); char[] subChars = two.toCharArray(); // 外层循环边界修正:确保剩余字符长度足够容纳子串 while (i <= originalLength - subLength) { int j = 0; // 逐个字符匹配子串 while (j < subLength && originalChars[i + j] == subChars[j]) { j++; } // 匹配成功则计数+1 if (j == subLength) { count++; // 若需要非重叠匹配,将此处改为 i += subLength 即可 i++; } else { i++; } } return count; } public static void main(String[] args) { int sum = StringInString("salamsal", "sal"); System.out.println(sum); // 输出结果为2 } }
关键修正点说明
- 新增长度预判:如果子串长度大于原字符串,直接返回0,避免无效循环。
- 修正循环边界:将
i<x改为i <= originalLength - subLength,确保剩余字符长度足够匹配子串,从根源避免数组越界。 - 优化匹配逻辑:用
i+j定位原字符串字符,不需要同时移动两个索引,逻辑更清晰,也避免了原逻辑中i被错误递增的问题。 - 明确匹配模式:代码注释了重叠/非重叠匹配的切换方式,你可以根据需求调整(原代码逻辑偏向重叠匹配)。
- 补全语法错误:修正了main方法中不完整的输出语句,确保程序能正常运行并打印结果。
内容的提问来源于stack exchange,提问作者Blackline
相关产品推荐
相关产品推荐

