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
相关产品推荐
相关产品推荐

