java.lang.IndexOutOfBoundsException: Index: 0, Grootte: 0 uitzondering

Ik krijg de fout java.lang.IndexOutOfBoundsException: Index: 0, Grootte: 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;
}

Antwoord 1, autoriteit 100%

Het probleem is dat je de set-methode gebruikt om het element op index 0 bij te werken

set(index,value) methode heeft een element nodig om bij die index te presenteren

maar je hebt daarvoor nog geen element toegevoegd op die positie in medium arraylist.

Je moet dus eerst een element toevoegen aan index 0, daarna kun je het bijwerken met de set-methode


Antwoord 2, autoriteit 50%

Je moet gebruiken

mediums.add(adDistribution.get(0));

in plaats van mediums.set(0, adDistribution.get(0));enz.

ArrayList.set(int, Object)vereist dat er een element is om te vervangen:

Vervangthet element op de opgegeven positie in deze lijst door het opgegeven element.

Gooien:
IndexOutOfBoundsException– als de index buiten bereik is (index < 0 || index >= size())

In een nieuwe lijst, size() == 0, dus set(0, something)mislukt.


Antwoord 3, autoriteit 17%

BEWERKEN:
Ik heb zojuist de onnodige if-statements verwijderd en vereenvoudigd om je code leesbaarder te maken.
Daarna heb ik de setfuncties vervangen door de addfunctie, omdat de set alleen bestaande elementen kan instellen.

EDIT2: Op basis van het antwoord van Andy Turner heb ik mijn code aangepast. Bedankt voor de suggesties!

Na deze aanpassingen zou de code er als volgt uit moeten zien (toevoegen/verwijderen/wijzigen naar uw wensen):

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

Other episodes