java.lang.IndexOutOfBoundsException:索引:0,大小:0异常

时间:2016-08-22 10:35:00

标签: java indexoutofboundsexception

我收到错误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;
}

3 个答案:

答案 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;
}