Container.remove (int i) lève une exception inattendue ArrayIndexOutOfBoundsException

StackOverflow https://stackoverflow.com/questions/1419745

  •  07-07-2019
  •  | 
  •  

Question

J'essaie de supprimer tous les composants sauf un premier composant enfant d'un conteneur Java. Les journaux de code suivants " Il y a 3 " et lève une exception ArrayIndexOutOfBoundsException: index de tableau hors de portée: 2

int componentCount = cardPanel.getComponentCount();
logger.info("There are " + componentCount);
for (int i = 1; i < componentCount; i++) {
    cardPanel.remove(i);
}

Cependant, cette version modifiée fonctionne parfaitement:

Component[] components = cardPanel.getComponents();
logger.info("There are " + components.length);
for (int i = 1; i < components.length; i++) {
    cardPanel.remove(components[i]);
}

Il semble que Container.getComponentCount () et Container.remove (int i) ne parviennent pas à s’accorder sur le nombre de composants du conteneur. Quelqu'un d'autre a-t-il rencontré ce problème?

Était-ce utile?

La solution

Lorsque vous utilisez cardPanel.remove (i), le nombre de composants diminue.

Vous avez donc [0, 1, 2] et supprimez l'élément à l'index 1.
Vous avez maintenant [0, 2] et supprimez l’élément à l’index 2, qui lève l’exception ArrayIndexOutOfBoundsException.

La version modifiée fonctionne car elle supprime l'objet réel du conteneur plutôt que de l'index.

Essayez ceci à la place

int componentCount = cardPanel.getComponentCount();
logger.info("There are " + componentCount);
for (int i = 1; i < componentCount; i++) {
    cardPanel.remove(1);
}

Autres conseils

La réponse de Benny est correcte, mais selon le conteneur, il peut s'avérer inefficace. Quelque chose comme un ArrayList n'aime pas vraiment supprimer plusieurs fois les éléments de l'avant, car il copie à chaque fois le reste des données.

Voici une alternative:

for (int i = cardPanel.getComponentCount() - 1; i >= 1; i--)
{
    cardPanel.remove(i);
}

En gros, cela commence à la fin et se poursuit vers le début.

Cela ne sera significatif que pour les grandes collections, mais il est utile de connaître la technique.

Les index commencent à 0, trois éléments signifiant que le premier élément est à l'indice 0, le deuxième à l'indice 1 et le troisième et donc le dernier à l'indice 2.

Container.remove (int i) supprime l'élément de l'index i

Votre code supprime les éléments à 1,2,3

Qu'est-ce que vous essayez de faire? Si vous souhaitez supprimer tous les éléments d'un conteneur, removeAll est le bon choix.

Si vous devez traiter les éléments tout en les retirant, l'idiome typique est d'aller d'un bout à l'autre, comme l'explique Jon Skeet.

Sauf s'il est nécessaire de passer de 0 à la fin, dans ce cas, vous continuez de supprimer l'élément 0:

for (int i = 0; i < componentCount; i++) {
    cardPanel.remove(0);
}

Si vous souhaitez supprimer des éléments en fonction d'une condition de leur index, il est probablement préférable d'utiliser un itérateur explicite pour les supprimer tout en conservant votre propre décompte d'index.

Par exemple, pour supprimer tous les objets à un index impair:

    int index = 0;
    final Iterator<String> iterator = list.iterator();
    while (iterator.hasNext())
    {
        iterator.next();
        if (index % 2 != 0)
        {
            iterator.remove();
        }
        index++;
    }

Bien que cela soit un peu plus long, cela évite les codes compliqués et fonctionne également lorsque la liste contient des objets identiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top