Java IndexOutOfBoundsException "Izvor se ne uklapa u odredište"

1. Pregled

U Javi je izrada kopije a Popis ponekad može proizvesti IndexOutOfBoundsException: “Izvor ne odgovara destinaciji”. U ovom ćemo kratkom vodiču pogledati zašto imamo ovu pogrešku kada koristimo Zbirke.kopija metoda i kako se može riješiti. Također ćemo pogledati alternative za Zbirke.kopija da napravite kopiju popisa.

2. Reproduciranje problema

Počnimo s metodom za stvaranje kopije a Popis koristiti Zbirke.kopija metoda:

statički popis copyList (izvor popisa) {Odredište popisa = novi ArrayList (source.size ()); Collections.copy (odredište, izvor); povratno odredište; }

Evo, copyList metoda stvara novi popis s početnim kapacitetom jednakim veličini izvornog popisa. Zatim pokušava kopirati elemente izvornog popisa na odredišni popis:

Izvor popisa = Arrays.asList (1, 2, 3, 4, 5); Popis copy = copyList (izvor);

Međutim, jednom kad pozovemo copyList metoda, ona donosi iznimku java.lang.IndexOutOfBoundsException: Izvor se ne uklapa u dest.

3. Uzrok Iznimka

Pokušajmo shvatiti što je pošlo po zlu. Prema dokumentaciji za Zbirke.kopija metoda:

Odredište mora biti najmanje toliko dugo koliko i popis izvora. Ako je duže, to neće utjecati na preostale elemente na popisu odredišta.

U našem smo primjeru stvorili novi Popis pomoću konstruktora s početnim kapacitetom jednakim veličini popisa izvora. Jednostavno dodjeljuje dovoljno memorije i zapravo ne definira elemente. Veličina novog popisa ostaje nula jer su kapacitet i veličina različiti atributi Popis.

Stoga, kada Zbirke.kopija metoda pokušava kopirati izvorni popis na odredišni popis, koji baca java.lang.IndexOutOfBoundsException.

4. Rješenja

4.1. Zbirke.kopija

Pogledajmo radni primjer za kopiranje a Popis drugom Popis, koristiti Zbirke.kopija metoda:

Odredište popisa = Arrays.asList (1, 2, 3, 4, 5); Izvor popisa = Arrays.asList (11, 22, 33); Collections.copy (odredište, izvor);

U ovom slučaju kopiramo sva tri elementa izvornog popisa na odredišni popis. The Nizovi.asList metoda inicijalizira popis elementima, a ne samo veličinom, stoga možemo uspješno kopirati izvorni popis na odredišni popis.

Ako samo zamijenimo argumente Zbirke.kopija metoda, bacit će java.lang.IndexOutOfBoundsException jer je veličina popisa izvora manja od veličine popisa odredišta.

Nakon ove operacije kopiranja, odredišni popis izgleda ovako:

[11, 22, 33, 4, 5]

Zajedno sa Zbirke.kopija metoda, u Javi postoje i drugi načini za kopiranje Popis. Pogledajmo neke od njih.

4.2. ArrayList Konstruktor

Najjednostavniji pristup kopiranju a Popis koristi konstruktor koji uzima a Kolekcija parametar:

Izvor popisa = Arrays.asList (11, 22, 33); Odredište popisa = novi ArrayList (izvor);

Ovdje jednostavno prosljeđujemo izvorni popis konstruktoru odredišnog popisa, koji stvara plitku kopiju izvornog popisa.

Odredišni popis bit će samo još jedna referenca na isti objekt na koji se poziva izvorni popis. Dakle, svaka promjena koju napravi bilo koja referenca utjecati će na isti objekt.

Stoga je upotreba konstruktora dobra opcija za kopiranje nepromjenjivih objekata poput Cijeli brojevi i Žice.

4.3. Dodaj Sve

Još jedan jednostavan način je korištenje Dodaj Sve metoda Popis:

Odredište popisa = novi ArrayList (); destination.addAll (izvor);

AddAll metoda kopirat će sve elemente izvornog popisa na odredišni popis.

U vezi s ovim pristupom treba napomenuti nekoliko točaka:

  1. Stvara plitku kopiju popisa izvora.
  2. Elementi popisa izvora dodani su na popis odredišta.

4.4. Java 8 Potoci

Java 8 predstavila je Stream API, koji je izvrstan alat za rad s Javom Zbirke.

Koristiti stream () metodom, kopiramo popis koristeći Stream API:

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

4.5. Java 10

Kopiranje a Popis je još jednostavniji u Javi 10. Korištenje kopija od() metoda omogućuje nam stvaranje nepromjenjivog popisa koji sadrži elemente dane Kolekcija:

Odredište popisa = List.copyOf (sourceList);

Ako želimo ići s ovim pristupom, moramo osigurati unos Popis nije null i da ne sadrži nijednu null elementi.

5. Zaključak

U ovom smo članku pogledali kako i zašto Zbirke.kopija metoda baca IndexOutOfBoundException “Izvor se ne datoteke u dest”. Uz to, istražili smo i različite načine kopiranja a Popis drugom Popis.

Primjeri prije Java-10 i primjeri Java 10 mogu se naći na GitHubu.


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