我收到错误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 :(得分:7)
问题是您使用set方法更新索引0处的元素
set(index,value)方法需要一个元素来呈现该索引
但在此之前你没有在媒体arraylist中的那个位置添加任何元素。
所以你需要先在索引0处添加一个元素,然后才能用set方法
更新它答案 1 :(得分:4)
您需要使用
mediums.add(adDistribution.get(0));
而不是mediums.set(0, adDistribution.get(0));
等。
ArrayList.set(int, Object)
要求有一个要替换的元素:
使用指定的元素替换此列表中指定位置的元素。
抛出:
IndexOutOfBoundsException
- 如果索引超出范围(索引&lt; 0 || index&gt; = size())
在新列表size() == 0
中,set(0, something)
失败。
答案 2 :(得分:2)
编辑: 我只是删除了不必要的if语句并简化它们以使代码更具可读性 然后我用添加函数替换了 set 函数,因为该集只能设置现有元素。
EDIT2:根据Andy Turner的回答,我修改了我的代码。谢谢你的建议!
经过这些修改后,代码应如下所示(根据需要添加/删除/修改):
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;
}