Java 带子字符串的StringIndexOutOfBoundsException

Java 带子字符串的StringIndexOutOfBoundsException,java,android,Java,Android,这是我的代码: String s = word; String[] split = s.split(Dictionary.searchTerm); String s1 = split[0]; String s2 = split[1]; String cut1 = "..."; String cut2 = s2.substring(0, 20); 我得到java.lang.StringIndexOutOfBoundsException:length=17;regionStart=0;由线串cut

这是我的代码:

String s = word;
String[] split = s.split(Dictionary.searchTerm);
String s1 = split[0];
String s2 = split[1];
String cut1 = "...";
String cut2 = s2.substring(0, 20);
我得到java.lang.StringIndexOutOfBoundsException:length=17;regionStart=0;由线串cut2=s2引起的区域长度=20。子串0,20

我想做的是,例如,这是原始字符串s

谷歌 安卓 Gmail Youtube 苹果 网间网操作系统 雨衣 微软 窗户

searchTerm是Youtube,因此所需的字符串是

…Youtube苹果


如何解决这个问题?基本上,我试图实现的是将搜索词之前的字符串替换为。。。并在searchTerm之后添加字符串的一部分。

将抛出StringOutOfBoundsException,因为您假设cut2在索引20处结束,并且字符串没有那么长。您需要计算s2的长度,而不是硬编码20。如果您希望s2的长度为21,您可能需要检查以确保它存储的是您认为它存储的内容。

您的需求可以通过以下代码实现,而不是经过严格测试

    String s = "Google     Android    Gmail    Youtube     Apple    iOS     Mac     Microsoft   Hewlett packard      Windows";

            String[] keywords = s.split("\\s+");

            String searchTerm = "Youtube";

            String endText = "";

            for(int index = 0; index < keywords.length; index++) {
                if(keywords[index].contentEquals(searchTerm)) {
                    if(index != (keywords.length - 1)) {
                        endText = endText + "..." + " " + searchTerm + " " + keywords[index + 1];
                    } else {
                        endText = endText + "..." + " " + searchTerm + " " + keywords[0];
                    }
                }
            }

// Here the endText would be: "... Youtube Apple"

字符串cut1=s1.replaces1。。。;与字符串cut1=…;相同。。。;。在这一行你想干什么?另外,请在代码示例中输入适当的值。不要说s是某个文本,而是将其放在代码s=some text.;中。。;。Dictionary.searchTerm也一样。抱歉。只想问一下,searchTerm实际上与所需字符串的关系如何。字符串s实际上是来自Sqlite数据库中某列的数据。Dictionary.searchTerm是用户在搜索栏中输入的文本。它是动态变化的,并附加到TextChangedListenerYes,我们理解这一点,但为了使您的示例更简单,最好用适当的值填充它,以便我们可以将其复制粘贴到我们的IDE并处理它。慢慢来,创建一个例子,让我们和未来的读者很容易地重现你的问题。不管怎样,你的错误是显而易见的。在s2.0子串中,20;您正试图减去前20个字符,但s2只包含17个字符的字符串。这里的预期结果是什么;只是保存要设置的字符串值的字符串的初始化。您可以发布您的代码,说明您是如何执行setText的,因为我已经测试了代码,它工作得非常好。谢谢,如果我将原始数据放在java代码中,即Google\n+Android\n,它就工作了。问题是,字符串s来自sqlite数据库,并且保存的文本没有\n字符。但在sqlite数据库中,Google、Android等都用新行分隔。您从sqlite数据库中获得的字符串是什么,您是否将所有关键字作为单独的字符串获得?如果是,则无需使用拆分函数创建数组,您只需创建一个arraylist并将数据库中的字符串添加到列表中,然后像我们在此处使用数组一样使用该列表。sqlite数据库中的字符串与我的问题一样,Google Android直到Windows中的单个字符串。没有\n字符。我使用DB Browser并按return键创建新行。在这种情况下,可以使用s.replaceAll\\s+,;拆分字符串;如果所有关键字都是没有空格的单个单词,则使用s.split。