Java IndexOutOfBoundsException “Kilde passer ikke i dest”

1. Oversikt

I Java lager du en kopi av en Liste kan noen ganger produsere en IndexOutOfBoundsException: “Kilde passer ikke inn i dest”. I denne korte opplæringen skal vi se på hvorfor vi får denne feilen når vi bruker Collections.copy metode og hvordan den kan løses. Vi vil også se på alternativer til Collections.copy for å lage en kopi av listen.

2. Gjengi problemet

La oss starte med en metode for å lage en kopi av en Liste bruker Collections.copy metode:

statisk liste copyList (liste kilde) {liste destinasjon = ny ArrayList (source.size ()); Collections.copy (destinasjon, kilde); retur destinasjon; }

Her, den copyList metoden oppretter en ny liste med en innledende kapasitet lik størrelsen på kildelisten. Deretter prøver den å kopiere elementene i kildelisten til destinasjonslisten:

Liste kilde = Arrays.asList (1, 2, 3, 4, 5); Listekopi = copyList (kilde);

Men når vi først ringer til copyList metode, kaster det et unntak java.lang.IndexOutOfBoundsException: Kilde passer ikke i dest.

3. Årsak til Unntak

La oss prøve å forstå hva som gikk galt. I følge dokumentasjonen for Collections.copy metode:

Destinasjonslisten må være minst like lang som kildelisten. Hvis det er lengre, påvirkes ikke de gjenværende elementene i destinasjonslisten.

I vårt eksempel har vi opprettet en ny Liste ved hjelp av en konstruktør med en innledende kapasitet lik størrelsen på kildelisten. Den tildeler ganske enkelt nok minne og definerer faktisk ikke elementer. Størrelsen på den nye listen forblir null fordi kapasiteten og størrelsen er forskjellige attributter for Liste.

Derfor, når Collections.copy metoden prøver å kopiere kildelisten til destinasjonslisten, kaster den java.lang.IndexOutOfBoundsException.

4. Løsninger

4.1. Collections.copy

La oss se på et arbeidseksempel for å kopiere en Liste til en annen Liste, bruker Collections.copy metode:

Liste destinasjon = Arrays.asList (1, 2, 3, 4, 5); Liste kilde = Arrays.asList (11, 22, 33); Collections.copy (destinasjon, kilde);

I dette tilfellet kopierer vi alle tre elementene i kildelisten til destinasjonslisten. De Arrays.asList metoden initialiserer listen med elementer og ikke bare en størrelse, derfor kan vi kopiere kildelisten til destinasjonslisten.

Hvis vi bare bytter argumentene til Collections.copy metoden, vil den kaste java.lang.IndexOutOfBoundsException fordi størrelsen på kildelisten er mindre enn størrelsen på destinasjonslisten.

Etter denne kopieringen ser destinasjonslisten ut som:

[11, 22, 33, 4, 5]

Sammen med Collections.copy metode, er det andre måter i Java å lage en kopi av Liste. La oss ta en titt på noen av dem.

4.2. ArrayList Konstruktør

Den enkleste tilnærmingen til å kopiere en Liste bruker en konstruktør som tar en Samling parameter:

Liste kilde = Arrays.asList (11, 22, 33); Liste destinasjon = ny ArrayList (kilde);

Her sender vi ganske enkelt kildelisten til konstruktøren av destinasjonslisten, som lager en grunne kopi av kildelisten.

Destinasjonslisten vil bare være en annen referanse til det samme objektet som kildelisten refererer til. Så, hver endring som gjøres av en hvilken som helst referanse, vil påvirke det samme objektet.

Derfor er det å bruke en konstruktør et godt alternativ for å kopiere uforanderlige objekter som Heltall og Strenger.

4.3. Legg til alle

En annen enkel måte er å bruke Legg til alle Metode av Liste:

Liste destinasjon = ny ArrayList (); destinasjon.addAll (kilde);

AddAll metoden vil kopiere alle elementene i kildelisten til destinasjonslisten.

Det er et par punkter å merke seg når det gjelder denne tilnærmingen:

  1. Det lager en grunne kopi av kildelisten.
  2. Elementene i kildelisten er lagt til destinasjonslisten.

4.4. Java 8 Strømmer

Java 8 har introdusert Stream API, som er et flott verktøy for å jobbe med Java Samlinger.

Bruker strøm() metode, lager vi en kopi av listen ved hjelp av Stream API:

Liste kopi = source.stream () .collect (Collectors.toList ());

4.5. Java 10

Kopiering a Liste er enda enklere i Java 10. Bruke kopi av() metoden lar oss lage en uforanderlig liste som inneholder elementene i det gitte Samling:

List destination = List.copyOf (sourceList);

Hvis vi vil gå med denne tilnærmingen, må vi sørge for innspill Liste ikke er det null og at den ikke inneholder noe null elementer.

5. Konklusjon

I denne artikkelen så vi på hvordan og hvorfor Collections.copy metoden kaster IndexOutOfBoundException “Kilde arkiveres ikke i dest”. Sammen med det utforsket vi også forskjellige måter å kopiere en Liste til en annen Liste.

Både eksemplene før Java-10 og eksemplene Java 10 finner du på GitHub.


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