如果子字符串不在我的原始字符串中,如何避免 StringIndexOutOfBoundsException?

How to avoid the StringIndexOutOfBoundsException if a substring is not in my original String?

我有类似的东西:

String idCodice = cessionarioCommittente.substring(
    cessionarioCommittente.indexOf("<IdCodice>") + 10,
    cessionarioCommittente.indexOf("</IdCodice>"));

用于提取 XML 文档的标记内的值,该文档由 cessionarioCommittente 字符串变量的内容表示。

问题是 cessionarioCommittente 字符串中可能不存在 <IdCodice> 标记。

所以在这种情况下我得到这个例外:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -10
    at java.lang.String.substring(String.java:1937)
    at it.sistinf.ediwea.fepa.LoadFatturePa.run(LoadFatturePa.java:103)
    at it.sistinf.ediwea.fepa.TestLoadFatturePa.main(TestLoadFatturePa.java:18)

我该如何解决这个问题?例如检查字符串中是否存在这个值?

您可以进行初步检查以确保您要查找的标签存在于字符串中:

String idCodice = null;
int startTag = cessionarioCommittente.indexOf("<IdCodice>");
int endTag = cessionarioCommittente.indexOf("</IdCodice>");
if (startTag >= 0 && endTag > startTag) {
    idCodice = cessionarioCommittente.substring(startTag + 10, endTag);
}

通过将索引存储在变量中,您可以避免搜索它们两次。

String.indexOf() returns -1 如果未找到字符串。在使用它之前检查 return 值是否 >= 0。

您可以按照 Eran 的建议进行操作,也可以使用 contains 方法和 三元 运算符:

idCodice = (cessionarioCommittente.contains("<IdCodice>") &&cessionarioCommittente.contains("</IdCodice>")) ? cessionarioCommittente.substring(cessionarioCommittente.indexOf("<IdCodice>") + 10, cessionarioCommittente.indexOf("</IdCodice>")):null;

在做子字符串之前,你可以使用类似的东西:

    String idCodice;
if(cessionarioCommittente.indexOf("<IdCodice>") > -1){
idCodice = cessionarioCommittente.substring(cessionarioCommittente.indexOf("<IdCodice>") + 10, cessionarioCommittente.indexOf("</IdCodice>"));
}

使用 indexOf 或 contains 在字符串中搜索时要注意性能问题(注意:contains() 方法在内部使用 indexOf())。 但我的问题是,你为什么要手动解析 xml,有很多图书馆这样做效率很高。 here!是一个非常简单的例子