これが問題が発生するコードです。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:インデックス:118981、サイズ:118981
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at 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:インデックス:118981、サイズ:118981
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at PageRank.main(PageRank。 java:146)
list_Iとlist_I2は同じサイズであり、デバッグで同じサイズであることを確認しました。