You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:20:03