读取子字符串时遭遇StringIndexOutOfBoundsException问题求助
解决StringIndexOutOfBoundsException的问题
这个报错的核心原因很明确:你调用substring(0, 20)时,当前行的字符串长度小于20,导致索引越界了。
Java里的String.substring(int beginIndex, int endIndex)方法有个关键细节:endIndex是不包含的——也就是说,它会截取从beginIndex到endIndex-1的字符。这意味着,要成功执行substring(0,20),你的字符串长度必须至少是20(因为最大索引是19,对应第20个字符)。如果某行内容很短,比如只有15个字符,那它的最大索引是14,调用substring(0,20)自然会抛出StringIndexOutOfBoundsException。
另外,你提到Y位于索引20处——这里要注意Java的索引是从0开始的,所以索引20对应的是第21个字符。如果确实要获取这个位置的字符,那你的行长度必须至少是21,否则同样会越界。
解决方案
先判断字符串长度再截取
在调用substring之前,先检查当前行的长度是否满足要求,避免越界:String temp = // 读取的当前行 if (temp.length() >= 20) { String classString = temp.substring(0, 20).trim(); // 在这里处理classString,检查是否包含F、C、Y并提取对应值 } else { // 处理长度不足的情况,比如跳过该行,或者记录日志 continue; // 示例:跳过当前行,继续处理下一行 }安全截取到指定长度(避免报错)
如果希望即使行长度不足20也能正常截取(取到行尾),可以用Math.min来限制endIndex:int endIndex = Math.min(temp.length(), 20); String classString = temp.substring(0, endIndex).trim(); // 后续处理逻辑直接定位Y的位置(如果目标是获取索引20的字符)
如果你明确要获取索引20处的字符(Y),可以这样做:if (temp.length() > 20) { // 因为索引20存在的话,长度至少是21 char targetChar = temp.charAt(20); if (targetChar == 'Y') { // 处理逻辑 } }
额外提醒
读取多行文件时,一定要考虑到各种异常情况:比如空行、长度过短的行、格式不符合预期的行。提前做长度检查或者异常捕获,可以让你的代码更健壮。
内容的提问来源于stack exchange,提问作者Gene Yuson
相关产品推荐
相关产品推荐

