Java程序报StringIndexOutOfBoundsException:元音首尾子串提取问题排查
解决Java字符串元音子串截取的越界异常问题
异常原因分析
StringIndexOutOfBoundsException: 索引22超出长度22 本质是访问了超出字符串有效索引范围的位置:Java字符串索引从0开始,长度为n的字符串,有效索引区间是[0, n-1]。出现这个问题通常是两个逻辑错误导致:
- 查找最后一个元音时,循环起始索引错误地设为字符串长度(而非长度-1),直接触发
charAt()越界 - 截取子串时,错误使用最后一个元音的索引作为
substring()的结束参数(该方法是左闭右开区间,要包含最后一个元音需用lastVowelIndex + 1,若原逻辑中这个值超出字符串长度也会报错)
常见错误代码示例
假设你的代码类似以下写法(模拟典型错误):
import java.util.Scanner; public class VowelSubstring { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); String vowels = "aeiouAEIOU"; int firstVowel = -1; for (int i = 0; i < input.length(); i++) { if (vowels.contains(String.valueOf(input.charAt(i)))) { firstVowel = i; break; } } int lastVowel = -1; // 错误:从字符串长度开始循环,直接访问无效索引 for (int i = input.length(); i >= 0; i--) { if (vowels.contains(String.valueOf(input.charAt(i)))) { lastVowel = i; break; } } // 错误:结束索引未+1,且若lastVowel是无效值会触发越界 String result = input.substring(firstVowel, lastVowel); System.out.println(result); } }
修正后的完整代码
import java.util.Scanner; public class VowelSubstring { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); String vowels = "aeiouAEIOU"; int firstVowelIndex = -1; // 遍历找第一个元音 for (int i = 0; i < input.length(); i++) { char currentChar = input.charAt(i); if (vowels.indexOf(currentChar) != -1) { firstVowelIndex = i; break; } } int lastVowelIndex = -1; // 从最后一个有效索引开始反向遍历找最后一个元音 for (int i = input.length() - 1; i >= 0; i--) { char currentChar = input.charAt(i); if (vowels.indexOf(currentChar) != -1) { lastVowelIndex = i; break; } } // 处理无元音的边界情况 if (firstVowelIndex == -1 || lastVowelIndex == -1) { System.out.println("输入字符串中未检测到元音"); return; } // 左闭右开区间,结束索引设为lastVowelIndex+1确保包含最后一个元音 String result = input.substring(firstVowelIndex, lastVowelIndex + 1); System.out.println(result); } }
核心修正点
- 最后一个元音的查找逻辑:循环起始值改为
input.length() - 1,确保只访问有效索引 - 子串截取范围:使用
lastVowelIndex + 1作为substring()的结束参数,符合方法左闭右开的规则,同时保证不会超出字符串长度(lastVowelIndex最大为input.length()-1,+1后等于字符串长度,是substring()的合法参数) - 边界情况处理:增加无元音输入的判断,避免因索引为-1导致的后续错误
测试验证
输入:Hi I have a dog named Patch
输出:i I have a dog named Pa
完全符合预期,且无任何异常抛出。
内容的提问来源于stack exchange,提问作者Bibz
相关产品推荐
相关产品推荐

