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

为何仅比较两个字符串第0索引却触发StringIndexOutOfBoundsException?

问题分析与修复

异常原因

触发String index out of range: 0的核心问题有三点:

  1. 未处理空字符串场景:代码直接调用charAt(0),如果s1或s3是空字符串,会直接抛出索引越界异常——哪怕你的测试用例输入非空,代码的鲁棒性也严重不足。
  2. 索引越界风险未规避:第二个循环中,j + n可能超过s3的长度,此时调用s3.charAt(j + n)会触发异常。
  3. 逻辑缺失:当s1的首字符与s3不匹配时,代码完全没处理s2与s3前缀匹配的逻辑,导致m始终为0,不符合需求。

修复后的代码

针对你统计连续匹配字符数的需求,修复后的代码如下:

public boolean isInterleave(String s1, String s2, String s3) {
    int n = 0;
    int m = 0;
    int len1 = s1.length();
    int len2 = s2.length();
    int len3 = s3.length();

    // 匹配s1与s3的连续前缀,规避空串和索引越界
    if (len1 > 0 && len3 > 0 && s1.charAt(0) == s3.charAt(0)) {
        n++;
        for (int j = 1; j < len1 && j < len3; j++) {
            if (s1.charAt(j) == s3.charAt(j)) {
                n++;
            } else {
                break;
            }
        }
    }

    // 匹配s2与s3剩余部分的连续前缀,确保索引不越界
    int start = n;
    if (len2 > 0 && start < len3) {
        for (int j = 0; j < len2 && (start + j) < len3; j++) {
            if (s2.charAt(j) == s3.charAt(start + j)) {
                m++;
            } else {
                break;
            }
        }
    }

    // 输出期望结果
    System.out.println(n + "," + m);
    // 原方法需返回boolean,可根据实际需求调整返回逻辑
    return n + m == len3;
}

测试验证

当输入s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"时:

  • s1的前2个字符"aa"与s3的前2个字符"aa"匹配,故n=2
  • 从s3的索引2开始,s2的前2个字符"db"与s3的"db"匹配,故m=2
  • 最终输出2,2,完全符合你的期望。

内容的提问来源于stack exchange,提问作者Duddu Bala Guru Venkata Arjun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:50:08