为什么在此子字符串方法中出现StringIndexOutOfBoundsException错误?

时间:2018-12-09 11:48:41

标签: java android substring

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分钟的战斗。

1 个答案:

答案 0 :(得分: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);