-2

以下のコードでは、次のエラーが発生します。

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

copyppList.size() のサイズは 1 です。

for (int domainData = 0; domainData < copiedppList.size(); domainData++) {
    if (domainData == 0) {
        firstValue.setNewValue(firstValue.getFieldValue());
        DomainItemFieldHistory oldValue = copiedppList.get(domainData + 1);
        if (firstValue.getFieldID().equals(oldValue.getFieldID())) {
            firstValue.setOldValue(oldValue.getFieldValue());
        }
    }
}

以下の行は、言及された問題を引き起こしています:

DomainItemFieldHistory oldValue = copiedppList.get(domainData + 1); 

どうすればこれを回避できますか?
エラーを防ぐために追加できる条件は何ですか?

4

6 に答える 6

1

終了条件をに変更するcopiedppList.size() - 1と、範囲外の例外が防止されます。

配列インデックスはゼロベースであるため、最後の有効なインデックスはですsize() - 1。投稿されたコードは反復できますsize() - 1が、次の呼び出しを行います。

copiedppList.get(domainData + 1);

例外を引き起こします。

ループがすべての要素を反復処理する必要がある場合は、+ 1呼び出しを保護する必要があります。例えば:

if (domainData < copiedppList.size() - 1)
{
    copiedppList.get(domainData + 1); // This is now safe, assuming
                                      // nothing reduces the size of
                                      // copiedppList since the if check.
}
于 2012-08-23T14:35:17.513 に答える
1

+1を削除します。

DomainItemFieldHistory oldValue = copiedppList.get(domainData)

于 2012-08-23T14:35:26.660 に答える
1

変更する必要があります:

  • どちらかget(domainData + 1);=>get(domainData);
  • またはfor (int domainData = 0; domainData < copiedppList.size(); domainData++)=>for (int domainData = 0; domainData < copiedppList.size() - 1; domainData++)

理由:リストは0からサイズ-1までインデックス付けされているため、ループの最後の反復で、list.get(size)そのような要素がないために失敗する呼び出しを試みています。

于 2012-08-23T14:35:28.637 に答える
1

以来

copyppList.size()は0

その場合はアクセスできません

copiedppList.get(domainData + 1); 

いつdomainData == 0

コレクションに複数のエントリがあることを確認する必要があります。

if (domainData == 0 && copiedppList.size() > 1) {
于 2012-08-23T14:43:00.703 に答える
1

の場合copiedppList.size() = 1、インデックス 0 のみが有効です

于 2012-08-23T14:35:45.167 に答える
1

copyppList.size() のサイズは 1 です。

.get(domainData + 1);指定されたサイズを超えるインデックス位置 [1] のデータを要求します。

それを保つ.get(domainData);

于 2012-08-23T14:37:53.633 に答える