尝试从长字符串中获取字符串时StringIndexOutOfBoundsException

时间:2017-11-11 01:21:51

标签: java android string substring

我尝试从长字符串获取字符串,即Firebase网址

"https://firebasestorage.googleapis.com/v0/b/No-manworld-3577.appspot.com/o/Contacts%2F1510361061636_Julien_Vcf?alt=media&token=c0bff20d-d115-4fef-b58c-4c7ffaef4296"

现在,如果您注意到上面字符串中名称 Julien 之前和之后得分不足。我想知道这个名字,但我得到了

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

这是我的一段代码

String s="https://firebasestorage.googleapis.com/v0/b/No-manworld-3577.appspot.com/o/Contacts%2F1510361061636_Julien_Vcf?alt=media&token=c0bff20d-d115-4fef-b58c-4c7ffaef4296";

        String newName=s.substring(s.indexOf("_")+1, s.indexOf("_"));
        System.out.println(newName);

2 个答案:

答案 0 :(得分:2)

正如我在评论中所说,当使用子字符串时,第一个数字必须小于第二个数字。

在您的情况下,您使用x + 1x调用子字符串。 x + 1> x因此子字符串失败,xs.indexOf("_")

我们了解到您正试图获取_的{​​{3}}。

以下代码会产生Julien

String s = "...";

int start = s.indexOf("_") + 1;
int end = s.indexOf("_", start);

// name will hold the content of s between the first two `_`s, assuming they exist.
String name = s.substring(start, end);

答案 1 :(得分:0)

如果要求不明确哪个2 _选择,那么这里是Java 8 Stream的做法..

public class Check {
    public static void main(String[] args) {
        String s = "https://firebasestorage.googleapis.com/v0/b/No-manworld-3577.appspot.com/o/Contacts%2F1510361061636_Julien_Vcf?alt=media&token=c0bff20d-d115-4fef-b58c-4c7ffaef4296";
        long count = s.chars().filter(ch -> ch == '_').count();
        if (count == 2) {
            System.out.println(s.substring(s.indexOf('_') + 1, s.lastIndexOf('_')));
        } else {
            System.out.println("More than 2 underscores");
        }
    }
}

为什么您的代码无效?

假设s.indexOf("_")得到一些正数,说10,然后转换为... {/ p>

String newName=s.substring(s.indexOf("_")+1, s.indexOf("_"));

String newName=s.substring(11, 10);

这会为StringIndexOutOfBoundsException方法提供endIndex < beginIndex subString