You need to enable JavaScript to run this app. Java实现字符串消元音功能报String index out of range:22异常如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Java实现字符串消元音功能报String index out of range:22异常如何解决

错误原因
  • 你在循环开始前就固定了lengthStr为原字符串的初始长度,但是每次执行删除元音的操作后,字符串实际长度会不断缩短,当循环变量i增长到超过当前字符串的最大索引时,调用str.charAt(i)就会触发索引越界异常
  • 额外隐藏问题:即使你把循环条件改成动态判断长度,删除字符后没有回退i,会导致连续相邻的元音出现漏删的情况:比如删除索引i位置的元音后,原索引i+1的字符会前移到i位置,下一轮循环i直接自增,就会跳过这个新到i位置的字符
修复方案

这里提供两种可行实现,更推荐第二种,避免频繁生成新字符串对象,性能更好:

方案1:修改原有逻辑

class Troll {
    private static final char[] VOWELS = {'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U'};

    public static String disemvowel(String str) {
        // 循环条件动态取当前字符串的长度,不要用固定的初始长度
        for (int i = 0; i < str.length(); ++i) {
            for (char vowel : VOWELS) {
                if (str.charAt(i) == vowel) {
                    str = removeChar(str, i);
                    // 删除成功后回退i,避免漏删下一个前移到当前位置的字符
                    i--;
                    // 匹配到元音后跳出元音判断循环,避免重复判断
                    break;
                }
            }
        }
        return str;
    }

    private static String removeChar(String str, int index) {
        return str.substring(0, index) + str.substring(index + 1);
    }
}

方案2:使用StringBuilder拼接非元音字符(推荐)

class Troll {
    private static final char[] VOWELS = {'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U'};

    public static String disemvowel(String str) {
        StringBuilder sb = new StringBuilder();
        for (char c : str.toCharArray()) {
            boolean isVowel = false;
            for (char vowel : VOWELS) {
                if (c == vowel) {
                    isVowel = true;
                    break;
                }
            }
            // 不是元音就拼接到结果里
            if (!isVowel) {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 18:27:03