String Index OutOfBOunds Exception

时间:2014-06-02 21:17:53

标签: java string exception indexing

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运算符的行。

请让我知道我做错了什么。该程序的目的是将每个字段存储在一个结构/类的数组中。这只是该计划的第一部分。

4 个答案:

答案 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;
}

此外,您可能希望交换trimisEmpty检查,以便过滤掉仅包含空格的行。

答案 2 :(得分:1)

你的例外原因比较清楚。回到你的要求,我认为它是典型的正则表达式用例。因为

  • 它使您免于indexOf()计算。
  • 它保存了错误处理部分,例如。 index=-1案例
  • 取决于您使用的jdk版本,如果&lt; 7,subString()具有潜在的mem泄漏问题。正则表达式,你没有那种风险。

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)

可能会发生两件事:

    如果字符串(行)不包含&#39; <#39;

  1. line.indexOf(&#34;)&#34;)&lt; line.indexOf(&#34;&gt;&#34;)if&#39;)&#39;出现在&#39;&gt;&#39;之前在字符串(行)

  2. 如果beginIndex大于endIndex

    和substring(begin_index,end_index)函数将抛出IndexOutOfBoundsException