2012-07-12 45 views
1

那么我有一个庞大的数据包大小的列表需要重新编写,我不想手动做,所以我要去为它制定计划。在Java中的字符串操作导致“字符串索引超出范围”

public static OutcommingPacket aClass198_1993 = new OutcommingPacket(68, 8); 

这和榜样的线路之一的,我所要做的,就是让程序去68,其存储在数据包串,并得到了8号,并存储在大小字符串。

这是我的代码到目前为止。

public class PacketSizeFixer { 

public static final String IN = "./out/OldPacketSizes.txt"; 
public static final String OUT = "./out/PacketSizesFormatted.txt"; 

public static void main(String[] args) throws IOException { 
    BufferedReader reader = new BufferedReader(new FileReader(IN)); 
    BufferedReader writer = new BufferedReader(new FileReader(OUT)); 

    String line; 
    String packet, size; 
    while ((line = reader.readLine()) != null) { 
     packet = line.substring(line.indexOf("new OutcommingPacket(", line.indexOf(", "))); 
     size = line.substring(line.indexOf(", "), line.indexOf(");")); 
    } 
} 

} 

我不确定是不是我做了正确的方式,因为我不断收到一个字符串索引超出范围

请帮助!

顺便说一句,并非所有的数据包都有相同的名称,有些更长,有些更短,数据包可能是两位数,并且尺寸也是如此。请帮忙!

+0

请张贴实际的异常和堆栈跟踪你的问题的一部分。这是那些本地化的调试问题之一,如果人们可以看到问题,那么这些问题可能会立即解决。 – 2012-07-12 00:30:23

+1

'输出'拼写为'm'。您正在为作家使用Reader。如果未找到子字符串,则忽略indexOf的-1返回值。您需要将要搜索的字符串的长度添加到子字符串调用的起始索引。 – 2012-07-12 01:45:40

回答

3

我假设这里有很多...

while ((line = reader.readLine()) != null) { 
    String pair = line.substring(line.lastIndexOf("("), line.lastIndexOf(")")); 
    String values[] = pair.split(","); //values[0] == packet, values[1] == size 
} 
3

您可能会遇到此错误,导致找不到您要查找的子字符串(返回-1),然后在不检查返回的索引的情况下调用substring
尝试:

int index1 = line.indexOf("new OutcommingPacket("); 
int index2 = line.indexOf(", "); 
if (index1 > -1 && index2 > index1) 
    packet = line.substring(index1, index2 - index1); 
//same for the rest 
+0

也没有工作。 – 2012-07-12 00:27:01

+0

add:'System.out.println(“index1 =”+ index1 +“; and index2 =”+ index2);'只是为了确保...... – alfasin 2012-07-12 00:28:38

2

从你的榜样,它听起来就像你要提取的信息是:

#,# 

那么,为什么你不使用正则表达式呢?

CharSequence inputStr = "new OutcommingPacket(68, 8)"; 

String patternStr = "(\\d+),(\\d+)"; 

// Compile and use regular expression 
Pattern pattern = Pattern.compile(patternStr); 
Matcher matcher = pattern.matcher(inputStr); 
boolean matchFound = matcher.find(); 

if (matchFound) { 
    // Get all groups for this match 
    for (int i=0; i<=matcher.groupCount(); i++) { 
     String groupStr = matcher.group(i); 
    } 
} 

注:我没有测试过这个确切的模式,但它应该是接近至少需要更正

+0

我认为,因为OP解析了看起来是Java代码的东西输入将遇到格式器将部分代码包装到下一行的问题。我也认为模式字符串需要确保它只能找到位于指定构造函数模式中的数字,以及处理Java允许空白的可能的空白区域。当然,最后一点与OP的方法完全不符。 – 2012-07-12 00:39:26

相关问题