【问题标题】:Why am I getting StringIndexOutOfBoundsException error in this substring method?为什么在此子字符串方法中出现 StringIndexOutOfBoundsException 错误?
【发布时间】:2019-05-10 13:08:35
【问题描述】:
protected Void doInBackground(Void... voids) {

...

ABV = elem.select("td > span.muted").text();
Log.d("myLOG_ABV", ABV);
Log.d("myLOG_ABVlength", String.valueOf(ABV.length()));

/*String temp_ABV = ABV.substring(ABV.length()-6, ABV.length());*/

... }

结果

D/myLOG_ABV:俄罗斯河流酿造公司 American Wild Ale | 7.50% D/myLOG_ABV 长度:55

然后,我取消了注释代码。

...

ABV = elem.select("td > span.muted").text();
Log.d("myLOG_ABV", ABV);
Log.d("myLOG_ABVlength", String.valueOf(ABV.length()));

***String temp_ABV = ABV.substring(ABV.length()-6, ABV.length());***

...

结果

原因:java.lang.StringIndexOutOfBoundsException:length=0; 索引=-6

为什么我在这个子字符串方法中收到 StringIndexOutOfBoundsException 错误?

我在带有注释的代码中得到了 'ABVlength : 55' 的结果。

但是取消注释后,我得到了StringIndexOutOfBoundsException。

说真的,我与这段代码战斗了 7 小时 30 分钟。

【问题讨论】:

  • 可能这段代码被执行了多次,其中一些ABV是空的。
  • 异常消息说你得到它是因为你的字符串的长度是 0。为什么一次是 55 而另一次是 0 - 从你发布的代码中无法分辨。
  • @Eran / 谢谢 Eran。这是完全正确的。此代码在 FOR 语句中。我发现其中一个值是空的。所以我得到了这个错误。昨天,我修改了代码,然后我修复了它。非常感谢。

标签: java android substring


【解决方案1】:

所以我们有:

***String temp_ABV = ABV.substring(ABV.length()-6, ABV.length());***

Caused by: java.lang.StringIndexOutOfBoundsException: length=0; index=-6

在这种情况下,如何获得 -6 的索引? ABV 的长度必须为零,即""

ABV 可能至少应包含六个字符,但这表明其他地方存在错误。

怎么办?

首先,验证您的输入。

你通常会想要的地方:

if (abv.length() < 6) {
    throw new IllegalArgumentException("...");
}

接下来查找该值的来源并修复错误。

看起来您正在解析某种外部文档。在这种情况下,您可能希望处理更宽松:

int abvLen = abv.length();
int abvEndIndex = abvLen - 6;
if (abvEndIndex < 0) {
    log.error("ABV length less than 6", abv);
    abvEndIndex = 0;
}
String abvEnd = abv.substring(abvEndIndex, abvLen);

【讨论】:

  • 谢谢汤姆。我的代码在 FOR 语句中。我发现其中一个值是空的。所以我得到了这个错误。昨天,我修改了代码。然后我修好了。感谢真诚的回复。 :)
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2015-06-29
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多