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

Java中使用for循环移除元音时出现字符串索引越界问题

修复移除字符串元音时的结尾元音报错问题

嘿,我来帮你解决这个问题!从你描述的“字符串以元音结尾时报错”情况来看,大概率是你原来的移除逻辑犯了索引越界的错误——比如直接在原字符串上做删除操作,但Java字符串是不可变的,每次删除后长度都会变化,循环的索引没跟上这个变化,最后就触发了StringIndexOutOfBoundsException。

先给你看修复后的完整代码,再详细解释解决思路:

package program5; 
import java.util.Scanner; 
public class Disemvoweling { 
    public static void main(String[] args) { 
        Scanner scnr = new Scanner(System.in); 
        String phrase; 
        System.out.println("Welcome to the disemvoweling utility!");
        System.out.print("Enter a phrase to disemvowel: ");
        phrase = scnr.nextLine();
        
        // 用StringBuilder构建结果,避免字符串不可变带来的索引问题
        StringBuilder disemvoweledResult = new StringBuilder();
        // 覆盖大小写所有元音
        String vowels = "aeiouAEIOU";
        
        // 遍历原字符串的每一个字符
        for (int i = 0; i < phrase.length(); i++) {
            char currentChar = phrase.charAt(i);
            // 非元音字符才加入结果
            if (vowels.indexOf(currentChar) == -1) {
                disemvoweledResult.append(currentChar);
            }
        }
        
        System.out.println("Disemvoweled phrase: " + disemvoweledResult.toString());
        scnr.close();
    }
}

为什么这个方案能解决你的问题?

你原来的错误逻辑大概是这样的:遍历字符串时遇到元音,就用substring拼接来删除这个元音,但每次删除后原字符串的长度会减1,而循环的i还在继续递增。当最后一个字符是元音时,i等于原字符串的最后一个索引,执行substring(i+1)就会超出新字符串的长度,直接抛出异常。

而用StringBuilder的方式是只读取原字符串、不修改它:我们从头到尾遍历原字符串的每一个字符,只把非元音字符添加到StringBuilder里,完全不需要处理索引删除的问题,不管字符串开头、中间还是结尾有没有元音,都能安全运行。

额外小提示

  • 一定要覆盖大小写元音,不然像A、E这类大写元音会被错误保留
  • 用完Scanner后记得关闭,养成良好的资源管理习惯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:29:31