Java统计字符串中数值个数时出现数组越界异常的问题排查
解决Java字符串数值统计中的索引越界异常
这个问题我之前也碰到过,本质是字符串索引合法性的问题,咱们一步步拆解解决:
首先分析异常根源:你取消注释while循环后抛出StringIndexOutOfBoundsException,是因为Java对字符串索引的合法性检查非常严格——字符串的有效索引范围是0到str.length()-1。当循环到字符串最后一个字符且该字符是数字时,while循环里的i++会让i的值变成str.length(),此时再执行str.charAt(i)就会超出合法索引范围,直接触发异常。而C++里这种情况属于未定义行为(可能不报错,但本质是不安全的),所以看起来能“正常运行”。
另外,你原来的代码逻辑还有个小问题:注释while时统计的是单个数字的数量(输出5),但我们需要的是连续数字组成的数值总数(输出2),所以count的计数逻辑也需要调整。
修正后的代码
public class Test2{ public static void main(String[] args){ String str = "I was 2 years old in 2002"; int count = 0, i; for(i = 0; i < str.length(); i++){ if(str.charAt(i) >= 48 && str.charAt(i) <= 57){ count++; // 先判断索引是否合法,再检查是否为数字 while(i < str.length() && str.charAt(i) >= 48 && str.charAt(i) <= 57){ i++; } } } System.out.println("Output: " +count); } }
关键改动说明
- 添加索引合法性判断:在while循环的条件最前面加上
i < str.length(),确保我们永远不会访问超出字符串范围的索引。这个判断必须放在最前面,因为逻辑与(&&)会短路求值:如果i >= str.length(),后面的字符判断就不会执行,完美避免触发异常。 - 调整count的计数逻辑:现在是遇到一个数值的开头(第一个数字)就count加1,然后用while循环跳过整个连续数字序列,这样就不会把一个数值里的每个数字都重复计数,而是把整个连续数字串算作一个数值,完全符合题目要求。
运行修正后的代码,就能得到正确输出2啦。
内容的提问来源于stack exchange,提问作者Prince Raj
相关产品推荐
相关产品推荐

