StringIndexOutOfBoundsException

StringIndexOutOfBoundsException

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:俄罗斯河酿造公司美国野麦酒| 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分钟的战斗。

最佳答案

因此,我们有:

***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);

07-26 01:09