エラー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;
}
問題は、インデックス0の要素を更新するためにsetメソッドを使用していることです。
set(index、value)メソッドには、そのインデックスに表示する要素が必要です
しかし、その前に中配列リストのその位置に要素を追加していません。
したがって、最初にインデックス0に要素を追加する必要があります。その後、setメソッドでのみ要素を更新できます
使用する必要があります
_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)
は失敗します。
編集:私は不要な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;
}