这是我的代码,问题发生了,我用粗体第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++;
}
以下是错误消息:
线程“main”中的异常java.lang.IndexOutOfBoundsException:Index: 118981,大小:118981
在java.util.ArrayList.RangeCheck(未知 源)
在java.util.ArrayList.get(未知来源)
在 PageRank.main(PageRank.java:90)
我不知道出了什么问题,因为它不是一个nullpointer异常,就像我预期的那样,如果出现错误......
更新 好的,我在初始位置修复了问题,但现在发生在这里:
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
}
错误讯息:
线程“main”中的异常java.lang.IndexOutOfBoundsException:Index: 118981,大小:118981
在java.util.ArrayList.RangeCheck(未知 源)
在java.util.ArrayList.get(未知来源)
在 PageRank.main(PageRank.java:146)
list_I和list_I2的大小相同,我在调试中已经确认了。
答案 0 :(得分:1)
条件应该是:
while ((l<list_L.size())&&(i<list_I.size()))
不是
while ((l<=list_L.size())&&(i<=list_I.size()))
如果列表的大小为 X ,则列表的最后一个索引为 X-1 。
答案 1 :(得分:1)
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中的列表(和数组)零索引 - 基本上,它们的索引来自{{1} } 0
,而不是n-1
到1
。
更新:
n
如果您在此处获得IndexOutOfBoundsException,则list_I和list_I2 必须具有不同的大小,或者代码中的其他位置必须存在拼写错误。这是唯一的可能性。