ArrayIndexOutOfBoundsException异常:访问split分割后数组索引2报错如何解决
问题根因与解决方案
核心报错原因
- 索引用法错误:Java数组为0起始索引,若要获取分割后数组的第二个元素,应使用下标
1,直接使用2作为下标时,只要数组长度小于3就会抛出越界异常。 - 正则匹配逻辑有疏漏:
gh2[i].matches("[0-9]+")要求整个字符串完全由数字组成,若gh2的元素存在前后空格、换行等不可见字符,会直接匹配失败,导致listawynikow实际没有符合要求的元素。你修改取反逻辑后可以正常运行,就是因为取反后匹配了所有非全数字的元素,列表不为空所以split后数组长度足够,但不符合你的数据筛选需求。 - 混淆了ArrayList的初始容量和实际元素数量:初始化时传入的
gh2.length只是设定列表的初始存储空间大小,不是实际存储的元素个数,实际元素数需要调用listawynikow.size()获取,大概率你的列表实际没有存入任何元素,才会导致后续拼接的字符串没有分号分隔符,split后数组长度仅为1。
修复方案
- 优化正则匹配逻辑,先去除字符串前后空白再做匹配,避免不可见字符影响匹配结果
- 删掉多余的StringBuilder拼接+split逻辑,直接将ArrayList转为数组即可,既减少冗余操作也能避免拆分出错
- 调用元素时注意使用0起始索引,第二个元素的下标为1
优化后完整代码
ArrayList<String> listawynikow = new ArrayList<>(gh2.length); for (int i = 0; i < gh2.length; i++) { // 先去除前后空白再匹配数字 if (gh2[i].trim().matches("[0-9]+")) { listawynikow.add(gh2[i].trim()); } } // 直接转数组,不需要拼接再拆分 String[] WYNIKI = listawynikow.toArray(new String[0]);
如果仅需要获取列表的第二个元素,连转数组的步骤都可以省略,直接调用listawynikow.get(1)即可。
内容的提问来源于stack exchange,提问作者Brucee Logan
相关产品推荐
相关产品推荐

