java - 字符串索引越界异常

标签 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));

当我运行此程序时,遇到字符串越界异常,并显示以下错误消息

线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-2
它指向带有indexOf运算符的行。

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

最佳答案

嗯,我不知道你的文件有什么样的字符串(行),但你可能会得到一个长度为1的字符串,在这种情况下,下面的行会产生异常。

line = line.substring(2 + line.indexOf(">") , line.indexOf(")"));

此外,如果您的 String(line) 没有 ')',那么在这种情况下 line.indexOf(")") 将给出 -1,这是没有意义的。

此外,您自己尝试以下代码,将会重现与您的代码相同的异常。

String x = "a";
System.out.println(x.substring(2 + x.indexOf(">") , x.indexOf(")")));

在字符串 x 中,存储不包含“>”和“)”的任何字符串。

关于java - 字符串索引越界异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003464/

相关文章:

SQL SUBSTRING 与 RIGHT - 最佳实践

javascript - 删除第一个逗号前的文本

.net - 哪个异常终止进程? (iis 的 w3wp)

java - 如何在 Java 中将未检查的异常转换/包装为已检查的异常?

java - 未捕获的 java.nio.channels.UnresolvedAddressException

java - 无法从在 docker 中运行的服务向 kafka 生成消息

java - 升级到 10.0.1.Final 后,Infinispan 软索引文件存储出现 OutOfMemoryError

java - hibernate + EhCache = java.io.NotSerializableException

java - Final block 何时相对于 Return 运行

c - 如何使用 C 将字符串中的每个字符存储为数字