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

从字符串转换int值时触发StringIndexOutOfBoundsException问题求助

排查java.lang.StringIndexOutOfBoundsException异常问题

首先咱们直接定位异常的核心原因:从栈信息能看到,异常出现在String.substring(String.java:1911),错误提示String index out of range: -5,这说明你调用substring时传入的起始索引是负数。

对应到你的代码里,就是这一行:

result = Integer.parseInt(s.substring(s.indexOf("RESP:") + 5, s.indexOf(";")));

这里s.indexOf("RESP:")返回了-1(意味着当前字符串s里根本找不到"RESP:"这个子串),所以-1 + 5 = -5,把负数作为substring的起始索引,直接触发了StringIndexOutOfBoundsException。

问题根源

你的代码逻辑默认登录命令返回的字符串s一定包含"RESP:"和";",但实际运行时,读取到的s可能不符合这个预期——比如服务器返回了错误提示、响应格式发生变化、网络传输丢失了部分内容,都可能导致找不到目标子串。

修复方案

咱们需要给代码加上前置校验,先确认目标子串存在再执行截取,避免硬索引导致异常:

// 登录命令发送后读取返回内容
lineSize = dataInput.read(line);
if (lineSize <= 0) {
    // 处理读取为空或失败的情况
    result = -103;
    System.err.println("读取服务器响应失败,无有效内容");
} else {
    s = String.copyValueOf(line, 0, lineSize);
    // 先检查是否存在RESP:标识
    int respStartIndex = s.indexOf("RESP:");
    if (respStartIndex != -1) {
        // 从RESP:的位置开始找分号,避免匹配到前面无关的分号
        int semicolonIndex = s.indexOf(";", respStartIndex);
        if (semicolonIndex != -1) {
            try {
                result = Integer.parseInt(s.substring(respStartIndex + 5, semicolonIndex));
            } catch (NumberFormatException e) {
                // 处理截取内容不是有效整数的情况
                result = -104;
                System.err.println("RESP返回值不是有效整数:" + s);
            }
        } else {
            // 找不到分号的格式错误情况
            result = -102;
            System.err.println("服务器响应格式错误:缺少分号分隔符,内容为:" + s);
        }
    } else {
        // 找不到RESP:标识的情况
        result = -101;
        System.err.println("服务器响应未包含RESP:标识,内容为:" + s);
    }
}

额外调试建议

  1. 在读取到s之后,先打印s的完整内容,看看实际返回的是什么——这能帮你明确是服务器返回格式变了,还是其他原因导致找不到"RESP:"。
  2. 检查LoginCommand是否正确发送,有没有可能服务器没正确处理登录请求,返回了错误信息而非预期响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:11:48