【问题标题】:Java Strange IndexOutOfBoundsException ErrorJava奇怪的IndexOutOfBoundsException错误
【发布时间】:2012-05-03 01:46:09
【问题描述】:

这是发生问题的代码,我已将第 90 行加粗(错误消息表明问题源于此)[编辑:我不知道如何在代码块内加粗,我将其标记为一个箭头代替]:

while ((l<=list_L.size())&&(i<=list_I.size())) {
    if (list_I.get(i).url.compareTo(list_L.get(l).src) == 0) {   //<--- LINE 90
        int firstmatch = l;
        int outgoing = 1;
        l++;

        while (list_I.get(i).url.compareTo(list_L.get(l).src) == 0) {
            outgoing++;
            l++;
        }

        l = firstmatch;
        for (int k=0; k<outgoing; k++) {
            list_R.add(new Triplet(list_L.get(l).src, list_L.get(l).dest, list_I.get(i).rank / outgoing));
            l++;
        }
    }
    else {
        sum_T += list_I.get(i).rank; //This shouldn't happen in this case...
    }

    i++;
}

这是错误信息:

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引: 118981, 尺码: 118981
在 java.util.ArrayList.RangeCheck(未知 来源)
在 java.util.ArrayList.get(未知来源)
在 PageRank.main(PageRank.java:90)

我不知道出了什么问题,因为它不是空指针异常,就像我所期望的那样,如果出现问题...

更新: 好的,我在初始位置解决了问题,但现在这里发生了:

for (int p=0; p<list_I2.size(); p++) {
    L2_norm += Math.pow((list_I.get(p).rank - list_I2.get(p).rank), 2); // <-- LINE 146
}

错误信息:

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引: 118981, 尺码: 118981
在 java.util.ArrayList.RangeCheck(未知 来源)
在 java.util.ArrayList.get(未知来源)
在 PageRank.main(PageRank.java:146)

list_I 和 list_I2 大小相同,我在调试中已经确认。

【问题讨论】:

  • 在条件检查中while ((l&lt;=list_L.size())&amp;&amp;(i&lt;=list_I.size())) { 尝试从两者中删除=
  • 这里的异常很清楚,您可能应该将条件更改为 i
  • IOOBE 与 NPE 一样“独特”。这个问题“过于本地化”,应该可以通过调试轻松解决——例如使用调试器 - 并仔细阅读错误消息。

标签: java loops indexoutofboundsexception


【解决方案1】:

条件应该是:

while ((l<list_L.size())&&(i<list_I.size()))

不是

while ((l<=list_L.size())&&(i<=list_I.size()))

如果列表的大小为 X,则列表的最后一个索引为 X-1

【讨论】:

  • 好的,解决了那里的问题,但它现在又出现在其他地方,向 OP 添加了详细信息。
【解决方案2】:
while ((l<=list_L.size())&&(i<=list_I.size())) {

应该是

while ((l<list_L.size())&&(i<list_I.size())) {

特别是,list_I.get(list_I.size()) 会抛出 IndexOutOfBoundsException,因为 Java 中的列表(和数组)是零索引——基本上,它们的索引从 0n-1,不是1n

更新:

for (int p=0; p<list_I2.size(); p++) {
   L2_norm += Math.pow((list_I.get(p).rank - list_I2.get(p).rank), 2);
}

如果您在此处收到 IndexOutOfBoundsException,则 list_I 和 list_I2 必须具有不同的大小,或者代码中的其他地方一定有错字。这真的是唯一的可能。

【讨论】:

  • 这修复了它,但现在我在其他地方遇到了同样的错误,我在 OP 中添加了信息。
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多