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

Comparator代码报错排查:重复名称触发StringIndexOutOfBoundsException

问题排查:Comparator实现中的StringIndexOutOfBoundsException异常

咱们直接拆解问题根源:当两个Tecnico对象的名称完全相同时,你的compare方法会触发索引越界异常,核心原因是循环逻辑没处理“两个字符串完全相等”的边界情况,甚至连“一个字符串是另一个前缀”的场景也没覆盖。

错误原因分析

当a.getNombre()和b.getNombre()完全一致时:

  1. 循环条件i<PalabraA.length() && i<PalabraB.length() && PalabraA.charAt(i) == PalabraB.charAt(i)会一直成立,i会持续递增到等于两个字符串的长度(比如名称是"Juan",长度为4,i最终会变成4)。
  2. 循环结束后执行return PalabraA.charAt(i) - PalabraB.charAt(i),但字符串的有效索引范围是0到length()-1,i=4已经超出了"Juan"的最大索引(3),直接抛出StringIndexOutOfBoundsException。

另外还有个隐藏坑:如果一个字符串是另一个的前缀(比如"Maria"和"MariaLopez"),同样会触发异常——当i走到短字符串的长度时循环退出,再访问charAt(i)依然越界。

修复方案

方案1:完善原循环逻辑,覆盖所有边界

在循环结束后先判断遍历状态,再做后续比较:

public class OrdenarCrecienteTecnico implements Comparator<Tecnico> {
    @Override
    public int compare(Tecnico a, Tecnico b) {
        String palabraA = a.getNombre().toUpperCase();
        String palabraB = b.getNombre().toUpperCase();
        int i = 0;
        while(i < palabraA.length() && i < palabraB.length() && palabraA.charAt(i) == palabraB.charAt(i)){
            i++;
        }
        
        // 情况1:两个字符串完全相等,返回0
        if(i == palabraA.length() && i == palabraB.length()){
            return 0;
        }
        // 情况2:palabraA已遍历完,说明它更短(字典序更小)
        if(i == palabraA.length()){
            return -1;
        }
        // 情况3:palabraB已遍历完,说明palabraA更长(字典序更大)
        if(i == palabraB.length()){
            return 1;
        }
        // 情况4:找到第一个不同字符,比较差值
        return palabraA.charAt(i) - palabraB.charAt(i);
    }
}

方案2:直接复用String自带的compareTo方法(更简洁可靠)

Java的String类已经内置了完整的字典序比较逻辑,完全符合Comparator的返回规则,能自动处理所有边界情况,代码可以大幅简化:

public class OrdenarCrecienteTecnico implements Comparator<Tecnico> {
    @Override
    public int compare(Tecnico a, Tecnico b) {
        String palabraA = a.getNombre().toUpperCase();
        String palabraB = b.getNombre().toUpperCase();
        // String.compareTo返回规则:
        // 负数 → palabraA字典序小于palabraB
        // 0 → 两个字符串相等
        // 正数 → palabraA字典序大于palabraB
        return palabraA.compareTo(palabraB);
    }
}

小提示

Java变量名建议用小驼峰命名法,比如把PalabraA改成palabraA,更符合行业编码规范哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:43:20