web-dev-qa-db-fra.com

java.lang.IndexOutOfBoundsException: la source ne tient pas dans dest

Sur le code suivant:

static void findSubsets (ArrayList<Integer> numbers, int amount, int index)
{
    ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size());
    Collections.copy(numbersCopy, numbers);
}

Je reçois l'erreur:

Exception in thread "main" Java.lang.IndexOutOfBoundsException: Source does not fit in dest
        at Java.util.Collections.copy(Collections.Java:548)
        at backtracking2.Main.findSubsets(Main.Java:61)

Pourquoi?

63
andandandand

La capacité n'est pas égale à la taille. Le paramètre de taille que vous transmettez alloue simplement suffisamment de mémoire pour la taille. Il ne définit pas réellement d'éléments. C'est en fait une sorte d'exigence idiote de Collections.copy, mais c'est quand même un.

La partie clé de la Collections.copy JavaDocs :

La liste de destination doit être au moins aussi longue que la liste source. S'il est plus long, les éléments restants de la liste de destination ne sont pas affectés.

Vous devez simplement passer le List au constructeur de ArrayList pour copier tout le List pour éviter complètement le problème.

78
pickypg

C'est une très bonne question et cela a certainement à voir avec le fait que la définition d'une capacité de collections n'alloue pas nécessairement les objets sous-jacents, mais pourquoi le faites-vous de cette façon alors que vous pouvez simplement:

ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
18
paxdiablo

Le constructeur ArrayList(Collection<? extends E> c) copiera tous les éléments de c dans la nouvelle instance créée, copiant ainsi numbers dans numbersCopy. C'est la même chose que numbersCopy.addAll(numbers) également, ce qui est vraiment ce dont vous avez besoin.

Il est logique que Collection.copy requiert que le tableau dest soit suffisamment grand pour contenir tous les éléments du tableau source. Une analogie similaire est la fonction C memcpy et similaires.

4
Yanick Rochon

Lors de la création d'un ArrayList pour copier un autre ArrayList à l'aide de la méthode Collections.copy(), nous devons nous assurer que la destination List contient le même nombre de valeurs (pas seulement même taille) que la source List. Par exemple, si la source ArrayList a des valeurs [Rouge, Bleu, Vert], alors la destination ArrayList doit également contenir le même nombre d'éléments comme [Orange, Jaune, Bleu]. Si nous créons un ArrayList avec la même taille que la source ArrayList, il donnera OutOfBounds exception.

1
Arun Nair