web-dev-qa-db-fra.com

java.lang.IndexOutOfBoundsException: Index: 0, taille: 0 exception

J'obtiens l'erreur 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

Le problème est que vous utilisez la méthode set pour mettre à jour l'élément à l'index 0

la méthode set (index, value) a besoin d'un élément à présenter à cet index

mais vous n'avez ajouté aucun élément à cette position dans l'arraylist moyen avant cela.

Vous devez donc d'abord ajouter un élément à l'index 0 par la suite, vous seul pouvez le mettre à jour avec la méthode set

8
Devansh Kumar

Vous devez utiliser

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

plutôt que mediums.set(0, adDistribution.get(0)); etc.

ArrayList.set(int, Object) nécessite qu'il y ait un élément à remplacer:

Remplace l'élément à la position spécifiée dans cette liste par l'élément spécifié.

Lance: IndexOutOfBoundsException - si l'index est hors limites (index <0 || index> = size ())

Dans une nouvelle liste, size() == 0, donc set(0, something) échoue.

5
Andy Turner

EDIT: Je viens de supprimer les instructions if inutiles et de les simplifier pour rendre votre code plus lisible.
Ensuite, j'ai remplacé les fonctions set par la fonction add, car l'ensemble ne peut définir que les éléments existants.

EDIT2: Sur la base de la réponse d'Andy Turner, j'ai modifié mon code. Merci pour les suggestions!

Après ces modifications, le code devrait ressembler à ceci (ajoutez/supprimez/modifiez-le selon vos besoins):

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