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

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
    }
}

关键修正点说明

  1. 新增长度预判:如果子串长度大于原字符串,直接返回0,避免无效循环。
  2. 修正循环边界:将i<x改为i <= originalLength - subLength,确保剩余字符长度足够匹配子串,从根源避免数组越界。
  3. 优化匹配逻辑:用i+j定位原字符串字符,不需要同时移动两个索引,逻辑更清晰,也避免了原逻辑中i被错误递增的问题。
  4. 明确匹配模式:代码注释了重叠/非重叠匹配的切换方式,你可以根据需求调整(原代码逻辑偏向重叠匹配)。
  5. 补全语法错误:修正了main方法中不完整的输出语句,确保程序能正常运行并打印结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:27:50