Java IndexOutOfBoundsException „Zdroj sa nezmestí do cieľa“

1. Prehľad

V Jave vytvorenie kópie a Zoznam môže niekedy vyrobiť IndexOutOfBoundsException: „Zdroj sa nezmestí do cieľa“. V tomto krátkom tutoriáli sa pozrieme na to, prečo sa nám pri používaní prehliadača Windows zobrazí táto chyba Zbierky.kopírovať metóda a ako sa to dá vyriešiť. Taktiež sa pozrieme na alternatívy k Zbierky.kopírovať vytvoriť kópiu zoznamu.

2. Reprodukcia problému

Začnime s metódou vytvorenia kópie a Zoznam pomocou Zbierky.kopírovať metóda:

statický zoznam copyList (zdroj zoznamu) {List destination = nový ArrayList (source.size ()); Zbierky.kópia (miesto určenia, zdroj); cieľ návratu; }

Tu je copyList metóda vytvorí nový zoznam s počiatočnou kapacitou rovnajúcou sa veľkosti zdrojového zoznamu. Potom sa pokúsi skopírovať prvky zoznamu zdrojov do zoznamu cieľov:

Zoznam zdrojov = Arrays.asList (1, 2, 3, 4, 5); Zoznam copy = copyList (zdroj);

Akonáhle však zavoláme na copyList metóda, vyvolá výnimku java.lang.IndexOutOfBoundsException: Zdroj sa nezmestí do cieľa.

3. Príčina Výnimka

Pokúsme sa pochopiť, čo sa stalo. Podľa dokumentácie k Zbierky.kopírovať metóda:

Zoznam cieľov musí byť minimálne taký dlhý ako zoznam zdrojov. Ak je to dlhšie, zostávajúce prvky v zozname cieľov nebudú ovplyvnené.

V našom príklade sme vytvorili nový Zoznam pomocou konštruktora s počiatočnou kapacitou rovnou veľkosti zdrojového zoznamu. Jednoducho vyhradzuje dostatok pamäte a v skutočnosti nedefinuje prvky. Veľkosť nového zoznamu zostáva nulová, pretože kapacita a veľkosť sú odlišné atribúty súboru Zoznam.

Preto, keď Zbierky.kopírovať metóda sa pokúsi skopírovať zoznam zdrojov do zoznamu cieľov, čo hodí java.lang.IndexOutOfBoundsException.

4. Riešenia

4.1. Zbierky.kopírovať

Pozrime sa na pracovný príklad na kopírovanie a Zoznam do iného Zoznampomocou Zbierky.kopírovať metóda:

Cieľ zoznamu = Arrays.asList (1, 2, 3, 4, 5); Zoznam zdrojov = Arrays.asList (11, 22, 33); Zbierky.kópia (miesto určenia, zdroj);

V tomto prípade kopírujeme všetky tri prvky zoznamu zdrojov do zoznamu cieľov. The Arrays.asList metóda inicializuje zoznam s prvkami, nielen s veľkosťou, preto sme schopní úspešne skopírovať zdrojový zoznam do cieľového zoznamu.

Keby sme len vymenili argumenty Zbierky.kopírovať metóda, bude vrhať java.lang.IndexOutOfBoundsException pretože veľkosť zdrojového zoznamu je menšia ako veľkosť cieľového zoznamu.

Po tejto operácii kopírovania vyzerá zoznam cieľov takto:

[11, 22, 33, 4, 5]

Spolu s Zbierky.kopírovať touto metódou existujú v Jave ďalšie spôsoby, ako vytvoriť kópiu Zoznam. Poďme sa pozrieť na niektoré z nich.

4.2. ArrayList Konštruktér

Najjednoduchší prístup k kopírovaniu a Zoznam používa konštruktor, ktorý berie a Zbierka parameter:

Zoznam zdrojov = Arrays.asList (11, 22, 33); Cieľ zoznamu = nový ArrayList (zdroj);

Tu jednoducho odovzdáme zoznam zdrojov konštruktoru zoznamu cieľov, ktorý vytvorí plytkú kópiu zoznamu zdrojov.

Zoznam cieľov bude iba ďalším odkazom na rovnaký objekt, na ktorý odkazuje zoznam zdrojov. Takže každá zmena vykonaná akýmkoľvek odkazom ovplyvní rovnaký objekt.

Preto je použitie konštruktora dobrou voľbou na kopírovanie nemenných objektov ako Celé čísla a Struny.

4.3. pridať všetko

Ďalším jednoduchým spôsobom je použitie súboru pridať všetko metóda Zoznam:

Cieľ zoznamu = nový ArrayList (); destination.addAll (zdroj);

Doplnok addAll metóda skopíruje všetky prvky zoznamu zdrojov do zoznamu cieľov.

K tomuto prístupu je potrebné poznamenať niekoľko bodov:

  1. Vytvára plytkú kópiu zoznamu zdrojov.
  2. Prvky zoznamu zdrojov sú pripojené k zoznamu cieľov.

4.4. Java 8 Prúdy

Java 8 predstavila Stream API, čo je skvelý nástroj pre prácu s Javou Zbierky.

Pomocou Prúd() metódou, urobíme kópiu zoznamu pomocou Stream API:

Zoznam copy = source.stream () .collect (Collectors.toList ());

4.5. Java 10

Kopírovanie a Zoznam je v Jave 10 ešte jednoduchší. Používanie kópia() metóda umožňuje vytvoriť nemenný zoznam obsahujúci prvky daného Zbierka:

Cieľ zoznamu = List.copyOf (sourceList);

Ak chceme ísť týmto prístupom, musíme sa ubezpečiť, že sme doň vstupovali Zoznam nie je nulový a že neobsahuje žiadne nulový prvkov.

5. Záver

V tomto článku sme sa pozreli na to, ako a prečo Zbierky.kopírovať metóda hodí IndexOutOfBoundException „Zdroj nezadáva do cieľa“. Spolu s tým sme tiež preskúmali rôzne spôsoby kopírovania a Zoznam do iného Zoznam.

Príklady pred Java 10 aj príklady Java 10 nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found