-1

これが問題が発生するコードです。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は同じサイズであり、デバッグで同じサイズであることを確認しました。

4

2 に答える 2

1

条件は次のようになります:

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

いいえ

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

リストのサイズがXの場合、リストの最後のインデックスはX-1です。

于 2012-04-21T22:57:14.250 に答える
1
while ((l<=list_L.size())&&(i<=list_I.size())) {

おそらく

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

特に、Javaのリスト(および配列)はゼロインデックスlist_I.get(list_I.size())であるため、をスローします。基本的に、それらのインデックスはからではなく、になります。IndexOutOfBoundsException0n-11n

アップデート:

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サイズが異なるか、コードのどこかにタイプミスがある必要があります。それが本当に唯一の可能性です。

于 2012-04-21T22:57:35.873 に答える