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

LRU算法Java实现遇IndexOutOfBoundsException,求排查思路

解决java.lang.IndexOutOfBoundsException的常见遗漏点(结合你的LRU场景)

我太懂排查这个异常的痛苦了——尤其是在LRU这种需要精准操作列表/栈的算法里,一丁点下标错误就会触发这个烦人的异常。结合你给出的场景(3个帧、20长度的引用序列),我帮你梳理几个最容易忽略的坑:

  • 帧列表的下标操作未做边界检查
    你用ArrayList存储帧的话,任何get(index)、remove(index)操作都得确保index在0到frames.size()-1之间。比如在LRU替换逻辑里,要是你误把帧的数量(3)当成了最大下标(实际是2,因为下标从0开始),就会直接越界。另外,当你尝试删除“最久未使用”的元素时,有没有可能计算出的下标超出了当前帧列表的实际长度?比如帧还没填满的时候(比如只有2个元素),你却去删下标2的元素。

  • 引用序列遍历的循环条件写错
    你的引用序列长度是20,有效下标范围是0到19。如果遍历的时候循环条件写成了i <= referenceSequence.length而不是i < referenceSequence.length,最后一次循环就会访问下标20,直接触发异常。赶紧检查下遍历代码,比如:

    // 错误写法:
    for (int i = 0; i <= referenceSequence.length; i++) {
        int page = referenceSequence[i];
        // ...后续操作
    }
    // 正确写法应该是:
    for (int i = 0; i < referenceSequence.length; i++) {
    }
    
  • 命中帧时的移动逻辑未处理未命中情况
    在LRU里,当命中某个帧时,通常要把它移到“最近使用”的位置(比如栈顶)。如果你的代码是先删除再添加,但没先判断是否真的命中,就会出问题:

    int hitIndex = frames.indexOf(currentPage);
    frames.remove(hitIndex); // 如果hitIndex是-1(没找到这个页),这里直接抛出异常!
    frames.add(currentPage);
    

    一定要先判断hitIndex != -1再执行删除操作,不然未命中的时候调用remove(-1)肯定炸。

  • 帧数量变量未正确初始化
    你代码里开头写了int numberOfFrames =0;,如果后续没有把它正确赋值为你输入的3,那帧列表的最大允许长度就是0,任何添加操作后再访问下标都会越界。检查下numberOfFrames是否被正确设置为用户输入的3,而不是一直保持初始值0。

最后给个实用小技巧:在可能触发下标操作的地方加个简单的日志打印,比如:

int targetIndex = ...;
System.out.println("当前帧列表长度:" + frames.size() + ",要操作的下标:" + targetIndex);
frames.get(targetIndex);

这样能快速定位到哪一步的下标和列表长度不匹配,比瞎猜高效多了。

内容的提问来源于stack exchange,提问作者Sollus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:53:44