public static void main(String [] args) throws IOException{
BufferedReader in = new BufferedReader(new FileReader(".../senses/command_list"));
String line = null;
while((line = in.readLine()) != null){
if(line.isEmpty()){
continue;
}
line = line.trim();
line = line.substring(2 + line.indexOf(">") , line.indexOf("))"));
System.out.println(line);
}
以下是文件的摘录
en_actions_.add(new ClusterEntry<String>("photography",-1, 2, 620554,"photography",null));
en_actions_.add(new ClusterEntry<String>("diagnostic procedure",-1, 1, 177127,"diagnostic procedure",null));
en_actions_.add(new ClusterEntry<String>("emergency procedure",-1, 1, 177783,"emergency procedure",null));
en_actions_.add(new ClusterEntry<String>("medical procedure",-1, 1, 1024392,"medical procedure",null));
en_actions_.add(new ClusterEntry<String>("process",-1, 5, 5470189,"process",null));
当我运行这个程序时,遇到一个String out of bounds异常,出现以下错误信息
线程中的异常&#34; main&#34; java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-2
它指向indexOf运算符的行。
请让我知道我做错了什么。该程序的目的是将每个字段存储在一个结构/类的数组中。这只是该计划的第一部分。
答案 0 :(得分:2)
我不知道你的文件有什么样的字符串(行),但是你可能会得到一个长度为1的字符串,在这种情况下,下一行会产生异常。
line = line.substring(2 + line.indexOf(">") , line.indexOf(")"));
此外,如果您的String(行)没有')',那么在这种情况下line.indexOf(“)”)将给出-1,这没有任何意义。
此外,请自行尝试以下代码,并重现与您相同的异常。
String x = "a";
System.out.println(x.substring(2 + x.indexOf(">") , x.indexOf(")")));
在String x中,存储任何不包含'&gt;'的字符串和')'。
答案 1 :(得分:1)
看起来文件中的某一行没有>
或)
字符。实际上,我根本没有在文件数据中看到>
。其中一个运营商可能是多线的。将indexOf
解压缩到单独的变量中,并检查那些符号是否存在。
int index1 = line.indexOf(">");
if (index1 < 0) {
//skip this line
continue;
}
此外,您可能希望交换trim
和isEmpty
检查,以便过滤掉仅包含空格的行。
答案 2 :(得分:1)
你的例外原因比较清楚。回到你的要求,我认为它是典型的正则表达式用例。因为
index=-1
案例
String s = "en_actions_.add(new ClusterEntry<String>(\"photography\",-1, 2, 620554,\"photography \",null));";
Pattern p = Pattern.compile("(?<=>\\()[^)]*");
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group());
}
以上代码有一个后瞻性正则表达式,用于在>(
和)
之间获取文字,如果您愿意,可以添加<string>(
作为后视模式。
我会删除答案,如果它有点偏离主题。
答案 3 :(得分:1)
可能会发生两件事:
line.indexOf(&#34;)&#34;)&lt; line.indexOf(&#34;&gt;&#34;)if&#39;)&#39;出现在&#39;&gt;&#39;之前在字符串(行)
和substring(begin_index,end_index)函数将抛出IndexOutOfBoundsException