web-dev-qa-db-ja.com

java.lang.IndexOutOfBoundsException:インデックス:0、サイズ:0例外

エラーJava.lang.IndexOutOfBoundsException:Index:0、Size:0が発生します。

public Collection<AdDistribution> getAdDistribution(byte srch, byte cont) throws IndexOutOfBoundsException {

    List<AdDistribution> mediums = new ArrayList<>();
    List<AdDistribution> adDistribution = new ArrayList<>();
            adDistribution.add(AdDistribution.SEARCH);
            adDistribution.add(AdDistribution.CONTENT);
            if (adDistribution.isEmpty()) {
                return null;
              }

    if (srch == 0 && cont == 0) {
        mediums = new ArrayList<>();
        mediums.set(0, adDistribution.get(0));
    }
    if (srch == 1 || cont == 1) {
        mediums = new ArrayList<>();
        if (srch == 1) {
            mediums.set(0, adDistribution.get(0));
        } else if (cont == 1) {
            mediums.set(0, adDistribution.get(1));
        }
    }
    if (srch == 1 && cont == 1) {
        mediums = new ArrayList<>();
        mediums.set(0, adDistribution.get(0));
        mediums.set(1, adDistribution.get(1));
    }
            return mediums;
}
5
Manju

問題は、インデックス0の要素を更新するためにsetメソッドを使用していることです。

set(index、value)メソッドには、そのインデックスに表示する要素が必要です

しかし、その前に中配列リストのその位置に要素を追加していません。

したがって、最初にインデックス0に要素を追加する必要があります。その後、setメソッドでのみ要素を更新できます

8
Devansh Kumar

使用する必要があります

_mediums.add(adDistribution.get(0));
_

mediums.set(0, adDistribution.get(0));などではなく.

ArrayList.set(int, Object) 置き換える要素が必要です:

このリストの指定された位置にある要素を、指定された要素に置き換えます

スロー:IndexOutOfBoundsException-インデックスが範囲外の場合(index <0 || index> = size())

新しいリストではsize() == 0なので、set(0, something)は失敗します。

5
Andy Turner

編集:私は不要なifステートメントを削除し、コードを読みやすくするために単純化しました。
次に、セットは既存の要素しか設定できないため、set関数をadd関数に置き換えました。

EDIT2:アンディターナーの答えに基づいて、コードを変更しました。提案ありがとうございます!

これらの変更後、コードは次のようになります(必要に応じてコードを追加/削除/変更します)。

public Collection<AdDistribution> getAdDistribution(byte srch, byte cont) throws IndexOutOfBoundsException {

    List<AdDistribution> mediums = new ArrayList<>();

    if( ( srch == 0 && cont == 0 ) || srch == 1 ) {
        mediums.add(AdDistribution.SEARCH);
    }

    if( cont == 1 ) {
        mediums.add(AdDistribution.CONTENT);
    }

    return mediums;
}
2
Pohkalopokh