15 novembre 2020
Lorsque j'ai écrit le code en Java et vérifié s'il utilisait le test, j'ai reçu une exception appelée java.util.ConcurrentModificationException
, donc je vais résumer ce qu'est l'exception ConcurrentModificationException et ce qu'il faut faire.
Javadoc of ConcurrentModificationException déclare comme suit.
Cette exception est levée lorsqu'une méthode qui détecte un changement parallèle dans un objet ne permet pas un tel changement.
Fondamentalement, il est utilisé pour échouer d'abord pour échouer tôt et lancer une exception quand quelque chose qui répète des changements </ b>. Autrement dit, une exception s'est produite avant la fin du processus itératif.
L'instruction for-each utilise Iterator, qui n'est pas très redondant, mais vous pouvez accéder à des méthodes supplémentaires telles que remove ()
si vous refactorisez votre test pour utiliser Iterator. La méthode remove ne provoque pas d'exception ConcurrentModificationException, vous pouvez donc l'appeler pendant un processus itératif.
Dans le cas de mon code, il y avait un problème avec la façon de gérer ArrayList. ArrayList et Iterator contiennent en interne le "nombre de modifications". L'itérateur généré par la méthode iterator () de ArrayList vérifie s'il y a un écart dans le nombre de changements lors du démarrage de la méthode next () etc. utilisé lors du virage avec for, et en raison d'un écart, une exception de ConcurrentModificationException Se produisait. Il y avait la description suivante dans Javadoc ArrayList.
L'itérateur renvoyé par les méthodes iterator et listIterator de cette classe est failfast. Une fois l'itérateur créé, l'itérateur lève une ConcurrentModificationException si la liste est structurellement modifiée par une méthode autre que la méthode remove ou add de l'itérateur lui-même. Ainsi, lorsque des modifications sont apportées en parallèle, l'itérateur lève une exception immédiatement et gracieusement pour éviter le risque de comportement imprévisible à des moments imprévisibles dans le futur. Généralement, avec des modifications parallèles asynchrones, il n'est pas possible de garantir le comportement de restauration de l'itérateur, car il n'est pas possible de faire une garantie fiable. L'itérateur Failfast lève une ConcurrentModificationException basée sur le principe du meilleur effort. Par conséquent, c'est une erreur d'écrire un programme qui dépend de cette exception pour la précision. "Le comportement Failfast de l'itérateur ne doit être utilisé que pour détecter les bogues."
Classe ConcurrentModificationException Évitez ConcurrentModificationException en Java
Recommended Posts