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

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);
    }
}

核心修正点

  1. 最后一个元音的查找逻辑:循环起始值改为input.length() - 1,确保只访问有效索引
  2. 子串截取范围:使用lastVowelIndex + 1作为substring()的结束参数,符合方法左闭右开的规则,同时保证不会超出字符串长度(lastVowelIndex最大为input.length()-1,+1后等于字符串长度,是substring()的合法参数)
  3. 边界情况处理:增加无元音输入的判断,避免因索引为-1导致的后续错误

测试验证

输入:Hi I have a dog named Patch
输出:i I have a dog named Pa
完全符合预期,且无任何异常抛出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:55:16