2013-09-25 47 views
-1

我收到就行了以下异常,其中头部被分配,我不知道为什么:爪哇 - 字符串索引越界异常的

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

当使用“{1,2} ,3“作为s的值,运行一个调试器我可以按照循环,它正确地分配commaSpot为5,因为我认为它应该。但由于某些原因,s.charAt(commaSpot))并不认为5是一个有效的索引,即使s是7个字符长。

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()); 

回答

2

在这些线

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

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

5

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

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

你不commaSpot关心的字符串的值 - 或者说,你知道,这是一个逗号(Unicode值44,因此异常消息)。您关心的是commaSpot本身的价值,这是您想要分拆的地方。

+0

那么现在我觉得哑巴,谢谢!不,我希望尾部包含逗号,因为我模拟的是使用CFG头的解析器 - > set |数字,尾巴 - >,尾巴| (没有) – user2816221

+0

@ user2816221:好的 - 删除了答案的最后一部分:) –