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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:19:45