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

读取子字符串时遭遇StringIndexOutOfBoundsException问题求助

解决StringIndexOutOfBoundsException的问题

这个报错的核心原因很明确:你调用substring(0, 20)时,当前行的字符串长度小于20,导致索引越界了。

Java里的String.substring(int beginIndex, int endIndex)方法有个关键细节:endIndex是不包含的——也就是说,它会截取从beginIndex到endIndex-1的字符。这意味着,要成功执行substring(0,20),你的字符串长度必须至少是20(因为最大索引是19,对应第20个字符)。如果某行内容很短,比如只有15个字符,那它的最大索引是14,调用substring(0,20)自然会抛出StringIndexOutOfBoundsException。

另外,你提到Y位于索引20处——这里要注意Java的索引是从0开始的,所以索引20对应的是第21个字符。如果确实要获取这个位置的字符,那你的行长度必须至少是21,否则同样会越界。

解决方案

  • 先判断字符串长度再截取
    在调用substring之前,先检查当前行的长度是否满足要求,避免越界:

    String temp = // 读取的当前行
    if (temp.length() >= 20) {
        String classString = temp.substring(0, 20).trim();
        // 在这里处理classString,检查是否包含F、C、Y并提取对应值
    } else {
        // 处理长度不足的情况,比如跳过该行,或者记录日志
        continue; // 示例:跳过当前行,继续处理下一行
    }
    
  • 安全截取到指定长度(避免报错)
    如果希望即使行长度不足20也能正常截取(取到行尾),可以用Math.min来限制endIndex:

    int endIndex = Math.min(temp.length(), 20);
    String classString = temp.substring(0, endIndex).trim();
    // 后续处理逻辑
    
  • 直接定位Y的位置(如果目标是获取索引20的字符)
    如果你明确要获取索引20处的字符(Y),可以这样做:

    if (temp.length() > 20) { // 因为索引20存在的话,长度至少是21
        char targetChar = temp.charAt(20);
        if (targetChar == 'Y') {
            // 处理逻辑
        }
    }
    

额外提醒

读取多行文件时,一定要考虑到各种异常情况:比如空行、长度过短的行、格式不符合预期的行。提前做长度检查或者异常捕获,可以让你的代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:19:47