java使用List的subList方法时报超出索引异常


        int listSize=listviz.size();//总数据量
        int toIndex=800;//每次操作数
        int count=listSize/toIndex;
        if (listSize%toIndex!=0){
            count+=1;
        }
        System.out.println("总数据量:"+listSize);
        System.out.println("循环次数:"+count);
        for (int i = 0; i < count; i++) {
            List<DocInfo> newlist;
            if (i==count-1){
                System.out.println("处理间距:"+toIndex*i+","+listSize);
                newlist = listviz.subList(toIndex*i,listSize-1);
            }
            else {
                System.out.println("处理间距:"+toIndex*i+","+toIndex*(i+1));
                newlist = listviz.subList(toIndex*i,(toIndex*(i+1)-1));
            }
        }

日志显示

img

  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:javaAPI深入理解(1)如何截短一个List以及List.subList()方法的坑
  • 除此之外, 这篇博客: Java—List的使用【数据结构】中的 使用 subList 获取子序列 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 原型:List subList(int fromIndex,int toIndex) — 截取部分 list
    .
    包含下标为 fromIndex的元素,不包含下标为toIndex的元素

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Yolo");
        list.add("Java");
        list.add(2,"Yolo");
        System.out.println(list);
        
        System.out.println(list.subList(0, 2));
    }
    

    输出结果:

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    针对List的subList方法报超出索引大小的异常,可能是因为subList方法的参数范围设定不正确。具体来说,subList方法的第二个参数表示的是截取子列表时的结束位置,但是它实际上是开区间,也就是说,结果并不包含该结束位置所对应的元素。如果结束位置参数过大,超出了List本身的索引大小范围,就会抛出索引越界异常。因此,可以通过调整结束位置的参数来避免这种异常情况的发生。具体来说,需要确保结束位置参数小于等于List的长度,并且合理地选择起始和结束位置的值,以满足具体业务需求。下面是一个参考代码,演示如何使用subList方法快速截取列表的子列:

    import java.util.ArrayList;
    import java.util.List;
    
    public class TestSubList {
        public static void main(String[] args) {
            List<Integer> originalList = new ArrayList<>();
            originalList.add(1);
            originalList.add(2);
            originalList.add(3);
            originalList.add(4);
            originalList.add(5);
            //确定起始和结束位置可以根据具体需求进行调整
            int startIndex = 0;
            int endIndex = 2;
            //确保结束位置不超出List本身的索引范围
            endIndex = Math.min(endIndex, originalList.size());
            //使用subList方法截取子列
            List<Integer> subList = originalList.subList(startIndex, endIndex);
            //输出截取的结果
            System.out.println(subList.toString());
        }
    }
    

    上述代码中,我们首先定义了一个原始的列表originalList,然后根据具体需求选择起始和结束位置的值。为了确保结束位置参数不超出原始列表本身的索引范围,我们使用了Math.min方法对其进行了调整。最终,通过调用subList方法,得到了指定范围内的子列,并打印输出到控制台。

检查运行了你的代码 没有问题,这个错误看着像是数据库操作的问题,检查下你的字段数量

你debug 看下 这一行,然后进去看下 实际的比较情况,立马就知道了

img