【问题标题】:How to avoid the StringIndexOutOfBoundsException if a substring is not in my original String?如果子字符串不在我的原始字符串中,如何避免 StringIndexOutOfBoundsException?
【发布时间】:2015-09-01 01:05:48
【问题描述】:

我有类似的东西:

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

用于提取由cessionarioCommittente String 变量的内容表示的 XML 文档的标记内的值。

问题是&lt;IdCodice&gt; 标记可能不存在于cessionarioCommittente 字符串中。

所以在这种情况下我得到了这个异常:

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)

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

【问题讨论】:

  • 您应该为此使用 XML 解析器。

标签: java string substring indexof


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在执行子字符串之前,您可以使用以下内容:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-09
          • 2013-07-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-12
          • 2017-07-02
          • 1970-01-01
          • 2018-09-26
          相关资源
          最近更新 更多