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

Sur le code suivant:

static void findSubsets (ArrayList numbers, int amount, int index) { ArrayList  numbersCopy = new ArrayList(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?

    La capacité n’est pas égale à la taille. Le paramètre de taille que vous transmettez alloue simplement assez de mémoire pour la taille. Il ne définit pas réellement les éléments. C’est en fait une exigence idiote de Collections.copy , mais c’est néanmoins une exigence.

    La partie clé des JavaDocs Collections.copy :

    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 la List au constructeur de ArrayList pour copier toute la List afin d’éviter le problème.

    C’est une très bonne question et cela tient presque certainement au fait que la définition d’une capacité de collecte n’atsortingbue pas nécessairement les objects sous-jacents, mais pourquoi le faites-vous simplement lorsque vous le pouvez:

     ArrayList  numbersCopy = new ArrayList(numbers); 

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

    Il est logique que Collection.copy exige 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.