-1

我在分配 head 的行上遇到以下异常,我不知道为什么:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 44

当使用 "{1,2},3" 作为 的值时s,运行调试器我可以跟随循环,并且它正确地分配commaSpot为 5,正如我认为的那样。但是由于某种原因s.charAt(commaSpot)),即使 s 是 7 个字符长,它也不认为 5 是一个有效的索引。

int commaSpot = 0;
int bracePairs = 0;
for(int i = 0; i < s.length(); i++) {
   if(s.charAt(i) == '{') bracePairs++;
   if(s.charAt(i) == '}') bracePairs--;
   if(s.charAt(i) == ',' && bracePairs == 0) {
      commaSpot = i;
      break;
   }
}
head = s.substring(0, s.charAt(commaSpot));
tail = s.substring(s.charAt(commaSpot), s.length());
4

2 回答 2

5

问题是您使用的结果s.charAt(commaSpot)作为第二个参数 - 而不是commaSpot它本身。你要:

head = s.substring(0, commaSpot);
tail = s.substring(commaSpot, s.length());

您不关心字符串的值commaSpot- 或者更确切地说,您知道它是一个逗号(Unicode 值 44,因此是异常消息)。你在乎自己的价值commaSpot,也就是你要分裂的地方。

于 2013-09-25T16:52:21.023 回答
2

在这些行

head = s.substring(0, s.charAt(commaSpot));
tail = s.substring(s.charAt(commaSpot), s.length());

s.charAt(commaSpot)返回一个作为索引位置char处理的a 。int您想使用实际索引,即i,因此请保留并使用该值的副本 ( commaspot)。

于 2013-09-25T16:52:08.417 回答