Java StringIndexOutOfBoundsException问题排查:带连字符数字求和报错
问题排查与解决
异常原因
你遇到的StringIndexOutOfBoundsException是两处索引使用错误导致的:
socialNum.indexOf("")返回0:空字符串的索引查找会直接返回0,导致substring(socialNum.indexOf("-") + 1, 0)出现起始索引大于结束索引的情况(比如测试字符串"102-2-12"中,第一个-在索引3,起始索引是4,结束索引是0),违反了substring方法的参数规则。- 最后一段子串截取错误:
socialNum.substring(socialNum.lastIndexOf("-"), socialNum.length() - 1)会包含最后一个-本身,且length()-1会丢失最后一个字符,比如测试字符串里会截取到-1而非目标的12。
修复方案
方案1:使用split方法(推荐,简洁通用)
直接用-分割字符串,遍历分割后的数组转换为整数求和,无需手动处理索引:
public int chopAndAdd() { sum = 0; // 按"-"分割字符串 String[] parts = socialNum.split("-"); for (String part : parts) { // 转换为整数并累加 sum += Integer.parseInt(part); } return sum; }
方案2:手动处理索引(适合理解字符串操作逻辑)
如果要手动处理,需正确获取每个分隔符的位置,再截取对应区间:
public int chopAndAdd() { sum = 0; int firstDash = socialNum.indexOf("-"); int secondDash = socialNum.lastIndexOf("-"); // 截取第一段:0到第一个"-" sum += Integer.parseInt(socialNum.substring(0, firstDash)); // 截取第二段:第一个"-"+1到第二个"-" sum += Integer.parseInt(socialNum.substring(firstDash + 1, secondDash)); // 截取第三段:第二个"-"+1到字符串末尾 sum += Integer.parseInt(socialNum.substring(secondDash + 1)); return sum; }
测试验证
修改后运行你的测试用例test.setSocial("102-2-12"),会得到正确结果:SS# 102-2-12 has a total of 116(102+2+12=116)。
内容的提问来源于stack exchange,提问作者poez
相关产品推荐
相关产品推荐

