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