Java字符串匹配代码触发IndexOutOfBoundsException,请求错误排查
问题排查:ArrayList IndexOutOfBoundsException异常原因
问题场景
给定输入字符串集合与查询字符串集合,需统计每个查询字符串在输入字符串中的出现次数并返回结果数组,以下是实现该功能的Java代码:
public static List<Integer> matchingStrings(List<String> strings, List<String> queries) { List<Integer> s = new ArrayList<Integer>(queries.size()); for(int i = 0;i<queries.size();i++){ s.set(i,0); } for(int i = 0;i < queries.size();i++){ for(int j = 0; j<strings.size();j++){ if((strings.get(j)).equals(queries.get(i))){ s.set(i,(s.get(i)+1)); } } } return s; }
抛出的异常信息
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) at java.base/java.util.Objects.checkIndex(Objects.java:359) at java.base/java.util.ArrayList.set(ArrayList.java:441) at Result.matchingStrings(Solution.java:27) at Solution.main(Solution.java:68)
错误原因分析
核心问题出在ArrayList的初始化逻辑和set方法的使用上:
new ArrayList<Integer>(queries.size())仅设置了ArrayList的初始容量,但列表内部并没有实际添加任何元素,此时列表的size()返回值为0。set(int index, E element)方法的作用是替换列表中已存在的元素,要求传入的索引必须小于当前列表的size()。当你循环调用s.set(i,0)时,列表中没有任何元素,索引0不存在,直接触发IndexOutOfBoundsException。
修正思路
要初始化一个指定长度、每个元素为0的列表,应该用add方法填充元素,比如把第一个循环改成:
for(int i = 0;i<queries.size();i++){ s.add(0); }
或者用更简洁的方式初始化:
List<Integer> s = new ArrayList<>(Collections.nCopies(queries.size(), 0));
内容的提问来源于stack exchange,提问作者gagang
相关产品推荐
相关产品推荐

