logo

ConcurrentModificationException programoje „Java“.

ConcurrentModificationException įvyksta, kai objektą bandoma keisti vienu metu, kai tai neleistina. Ši išimtis dažniausiai pasitaiko dirbant su Java Collection klasės .

Pavyzdžiui - Neleidžiama, kad gija modifikuotų kolekciją, kai per ją kartojasi kita gija. Taip yra todėl, kad su juo iteracijos rezultatas tampa neapibrėžtas. Kai kurie „Iterator“ klasės diegimai suteikia šią išimtį, įskaitant visus JRE pateiktus bendrosios paskirties „Iterator“ diegimus. Iteratoriai, kurie tai daro, vadinami greitai nepavyksta nes jie greitai padaro išimtį, kai tik susiduria su tokia situacija, o ne susidurs su neapibrėžtu kolekcijos elgesiu bet kuriuo metu ateityje.

java loginė eilutė

Pastaba:Neprivaloma, kad ši išimtis būtų taikoma tik tada, kai kuri nors kita gija bandys modifikuoti Kolekcijos objektą. Taip pat gali atsitikti, jei vienoje gijoje yra keli metodai, kurie bando pažeisti objekto sutartį. Taip gali nutikti, kai gija bando modifikuoti kolekcijos objektą, kai kai kurie jį kartojagreitas iteratorius, iteratorius padarys išimtį.

Pavyzdys

 import java.awt.List; import java.util.*; public class Concurrentmodificationexception { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); Iterator it = list.iterator(); while (it.hasNext()) { Integer value = it.next(); System.out.println('List Value:' + value); if (value.equals(3)) list.remove(value); } } } 

Išvestis:

ConcurrentModificationException programoje „Java“.

Šiame pranešime sakoma, kad išimtis išmetama, kai iškviečiamas kitas metodas, nes iteratorius kartoja sąrašą, o mes tuo pačiu metu atliekame jo pakeitimus. Bet jei atliksime modifikacijas hashmapoje, kaip nurodyta toliau, tai nepadarys tokios išimties, nes nesikeis hashmap dydis.

Pavyzdžiui-

kelių eilučių komentaras powershell
 import java.awt.List; import java.util.*; public class concurrentmodificationexception { public static void main(String[] args) { HashMap map = new HashMap(); map.put(1, 1); map.put(2, 2); map.put(3,3); Iterator it = map.keySet().iterator(); while(it.hasNext()) { Integer key = it.next(); System.out.println('Map Value:' + map.get(key)); if (key.equals(2)) { map.put(1, 4); } } } } 

Išvestis:

 Map Value:1 Map Value:2 Map Value:3 

Šis pavyzdys veikia visiškai gerai, nes kol iteratorius kartoja žemėlapį, žemėlapio dydis nesikeičia. Atnaujinamas tik žemėlapis jei teiginys .

ConcurrentModificationException konstruktoriai

Yra 4 ConcurrentModificationException konstruktorių tipai -

Parsisiųsti autocad 2019 anglišką mediafire
  1. vieša ConcurrentModificationException() –
    Taip sukuriama ConcurrentModificationException be parametrų.
  2. vieša ConcurrentModificationException (eilutės pranešimas)
    Taip sukuriama ConcurrentModificationException su išsamiu pranešimu, nurodančiu išimtis.
  3. vieša ConcurrentModificationException (išmetama priežastis)
    Taip sukuriama ConcurrentModificationException su priežastimi ir pranešimu, kuris yra (cause==null?null:cause.toString()). Priežastį vėliau nustato Throwable.getCause().
  4. vieša ConcurrentModificationException (Eilutės pranešimas, Metimo priežastis)
    Taip sukuriama ConcurrentModificationException su išsamiu pranešimu ir priežastimi. (cause==null?null:cause.toString()). Pranešimą vėliau nuskaito Throwable.getMessage(), o priežastį vėliau nuskaito Throwable.getCause().

Kaip išvengti „ConcurrentModificationException“ kelių gijų aplinkoje?

Norėdami išvengti „ConcurrentModificationException“ kelių gijų aplinkoje, galime vadovautis šiais būdais:

  1. Užuot kartoję kolekcijos klasę, galime kartoti per masyvą. Tokiu būdu galime labai gerai dirbti su mažo dydžio sąrašais, tačiau tai sumažins našumą, jei masyvo dydis yra labai didelis.
  2. Kitas būdas gali būti užrakinti sąrašą įtraukiant jį į sinchronizuotą bloką. Tai nėra veiksmingas metodas, nes dėl to atsisakoma vienintelio kelių sriegių naudojimo tikslo.
  3. JDK 1.5 ar naujesnė versija suteikia ConcurrentHashMap ir CopyOnWriteArrayList klases. Šios klasės padeda mums išvengti vienalaikių modifikacijų išimties.

Kaip išvengti „ConcurrentModificationException“ vienos gijos aplinkoje?

Naudodami iteratoriaus funkciją Remove() galite pašalinti objektą iš pagrindinio rinkinio objekto.