Java索引数组越界异常

Java索引数组越界异常,java,Java,这个循环很奇怪 我在Java中运行了这个,它给出了一个索引越界异常。我在源代码中的任何地方都找不到intl声明,我也弄不清楚它是什么,也弄不清楚以这种方式声明它是合法的 但这里的交易是,我不明白这段代码在做什么。对于任何大小的resultSIList,它都会给出一个ArrayIndexOutOfBoundsException for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){

这个循环很奇怪

我在Java中运行了这个,它给出了一个索引越界异常。我在源代码中的任何地方都找不到
intl
声明,我也弄不清楚它是什么,也弄不清楚以这种方式声明它是合法的

但这里的交易是,我不明白这段代码在做什么。对于任何大小的
resultSIList
,它都会给出一个
ArrayIndexOutOfBoundsException

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
    resultSIList.get(i);
}
for(int i=offset,l=Math.min(i+maxItemsInOnePage,totalSIs);i
编辑:谢谢大家

下面是我用来理解整个循环的可运行代码。是的,这是一块可怕的垃圾

public class IndexOutOfBoundsTest {
    public static void main(String args[]){
        int offset = 50;

        int maxItemsInOnePage = 50;

        int totalSIs = 50;

        final int buildThis = 15;

        List resultSIList = new ArrayList();

        // build list
        for(int zz = 0; zz < buildThis; zz ++){
            resultSIList.add("Hi " + zz);
        }

        try{
            for (int i = offset,
                    d = Math.min(i + maxItemsInOnePage, totalSIs);
                    i < d; i++){

               System.out.println(resultSIList.get(i));
           }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
公共类IndexOutOfBoundsTest{
公共静态void main(字符串参数[]){
整数偏移=50;
int maxItemsInOnePage=50;
总积分=50;
最终int buildThis=15;
List resultSIList=new ArrayList();
//构建列表
对于(intzz=0;zz
检查偏移量是否小于列表的大小

检查偏移量是否小于列表的大小

此代码将'ResultsList'从'offset'位置循环到'offset+maxItemsInOnePage'和'totalSIs'中的最小值

如果offset>0且totalSIs=resultSIList.size(),我认为它不会给您一个越界异常


在您的示例中,偏移量为50,列表大小仅为15。您必须检查偏移量是否小于列表大小

此代码将'ResultsList'从'offset'位置循环到'offset+maxItemsInOnePage'和'totalSIs'中的最小值

如果offset>0且totalSIs=resultSIList.size(),我认为它不会给您一个越界异常


在您的示例中,偏移量为50,列表大小仅为15。您必须检查偏移量是否小于列表大小

要获取更多信息,您可以在运行时添加一些日志记录:

System.out.println("offset: " + offset);
System.out.println("maxItemsInOnePage: " + maxItemsInOnePage);
System.out.println("totalSIs: " + totalSIs);
System.out.println("resultSIList.size(): " + resultSIList.size());
for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
    System.out.println("i: " + i);
    resultSIList.get(i);
}
System.out.println(“偏移量:”+offset);
System.out.println(“maxItemsInOnePage:+maxItemsInOnePage”);
System.out.println(“totalSIs:+totalSIs”);
System.out.println(“resultSIList.size():”+resultSIList.size());
对于(int i=offset,l=Math.min(i+maxItemsInOnePage,totalSIs);i

运行这个程序应该会对你的问题有所帮助;最后一个打印的i超出了范围,通过分析前四个打印输出,您应该会发现您的问题。

要获得更多信息,您可以通过添加一些日志来运行它:

System.out.println("offset: " + offset);
System.out.println("maxItemsInOnePage: " + maxItemsInOnePage);
System.out.println("totalSIs: " + totalSIs);
System.out.println("resultSIList.size(): " + resultSIList.size());
for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
    System.out.println("i: " + i);
    resultSIList.get(i);
}
System.out.println(“偏移量:”+offset);
System.out.println(“maxItemsInOnePage:+maxItemsInOnePage”);
System.out.println(“totalSIs:+totalSIs”);
System.out.println(“resultSIList.size():”+resultSIList.size());
对于(int i=offset,l=Math.min(i+maxItemsInOnePage,totalSIs);i

运行这个程序应该会对你的问题有所帮助;最后一个被打印的i超出了范围,通过分析前四个打印输出,您应该发现您的问题。

您应该始终检查索引i是否小于大小

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs);
      i < l && i < resultSIList.size ();
      i++){
  resultSIList.get(i);
}
for(int i=offset,l=Math.min(i+maxItemsInOnePage,totalSIs);
i
您应该始终检查索引i是否小于大小

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs);
      i < l && i < resultSIList.size ();
      i++){
  resultSIList.get(i);
}
for(int i=offset,l=Math.min(i+maxItemsInOnePage,totalSIs);
i
当且仅当
总计
等于或小于
结果列表
的大小时,它才能按预期工作。再次检查该值。以下是一些随机值的工作示例:

List<Integer> resultSIList = Arrays.asList(1,2,3,4,5,6,7,8);
int totalSIs = resultSIList.size();
int maxItemsInOnePage = 2;
int offset = 1;

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
  resultSIList.get(i);
}

位于for循环后面,用于快速修复。

当且仅当
totalSIs
等于或小于
resultSIList
的大小时,它才能按预期工作。再次检查该值。以下是一些随机值的工作示例:

List<Integer> resultSIList = Arrays.asList(1,2,3,4,5,6,7,8);
int totalSIs = resultSIList.size();
int maxItemsInOnePage = 2;
int offset = 1;

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){
  resultSIList.get(i);
}

在for循环后面有一个快速修复方法。

我有一个词要告诉你:调试器。逐步进行,查看行为如何与您的假设不匹配。您是否有一个负的
偏移量
?结果的大小是多少?该片段从
偏移量
循环到
数学.min(偏移量+最大项sinonepage,totalSIs)-1
。(初始化写得很糟糕,但据我所知它就是这么做的。)但这里的人怎么知道这些变量是什么?什么是
resultSIList
等。?你必须发布所有相关的代码,否则没有人能帮你。也不应该使用“l”作为变量名。它看起来像1和I,使阅读代码变得非常困难。我有一个词要告诉你:调试器。逐步进行,查看行为如何与您的假设不匹配。您是否有一个负的
偏移量
?结果的大小是多少?该片段从
偏移量
循环到
数学.min(偏移量+最大项sinonepage,totalSIs)-1
。(初始化写得很糟糕,但据我所知它就是这么做的。)但这里的人怎么知道这些变量是什么?什么是
resultSIList
等。?你必须发布所有相关的代码,否则没有人能帮你。也不应该使用“l”作为变量名。它看起来像1和I,使读取代码变得非常困难。如果
偏移量
大于或等于