Java IndexOutOfBoundsException „A forrás nem illik a célba”

1. Áttekintés

Java-ban az a másolat készítése Lista néha előállíthat egy IndexOutOfBoundsException: „A forrás nem fér bele a célba”. Ebben a rövid bemutatóban megvizsgáljuk, miért kapjuk ezt a hibát a Gyűjtemények.másolat módszer és hogyan lehet megoldani. Megvizsgáljuk az alternatívákat is Gyűjtemények.másolat hogy másolatot készítsen a listáról.

2. A probléma megismétlése

Kezdjük egy módszerrel az a másolatának létrehozására Lista használni a Gyűjtemények.másolat módszer:

statikus List copyList (Lista forrás) {Lista rendeltetési hely = new ArrayList (forrás.size ()); Gyűjtemények.másolat (rendeltetési hely, forrás); visszaút; }

Itt a copyList A metódus új listát hoz létre, amelynek kezdeti kapacitása megegyezik a forráslista méretével. Ezután megpróbálja átmásolni a forráslista elemeit a céllistába:

Lista forrása = Arrays.asList (1, 2, 3, 4, 5); List copy = copyList (forrás);

Miután azonban felhívtuk a copyList módszer, kivételt vet java.lang.IndexOutOfBoundsException: A forrás nem illik a célba.

3. A Kivétel

Próbáljuk megérteni, mi ment rosszul. A. Dokumentációja szerint Gyűjtemények.másolat módszer:

A céllista legalább olyan hosszú legyen, mint a forráslista. Ha hosszabb, a céllista többi elemét ez nem érinti.

Példánkban létrehoztunk egy újat Lista a forráslista méretével megegyező kezdeti kapacitású konstruktort használva. Egyszerűen elegendő memóriát oszt le, és valójában nem határoz meg elemeket. Az új lista mérete nulla marad, mert a kapacitás és a méret különbözik a Lista.

Ezért, amikor a Gyűjtemények.másolat metódus megpróbálja átmásolni a forráslistát a céllistába, dob java.lang.IndexOutOfBoundsException.

4. Megoldások

4.1. Gyűjtemények.másolat

Nézzünk meg egy működő példát a Lista másiknak Lista, használni a Gyűjtemények.másolat módszer:

Lista rendeltetési hely = Arrays.asList (1, 2, 3, 4, 5); Lista forrása = Arrays.asList (11, 22, 33); Gyűjtemények.másolat (rendeltetési hely, forrás);

Ebben az esetben a forráslista mindhárom elemét átmásoljuk a céllistába. A Tömbök.asList A metódus nem csak méretben, hanem elemekkel inicializálja a listát, ezért sikeresen át tudjuk másolni a forráslistát a céllistába.

Ha csak felcseréljük a Gyűjtemények.másolat módszer, akkor dobni fog java.lang.IndexOutOfBoundsException mert a forráslista mérete kisebb, mint a céllista mérete.

A másolási művelet után a céllista a következőképpen néz ki:

[11, 22, 33, 4, 5]

Együtt a Gyűjtemények.másolat módszer, a Java-ban más módon is készíthet másolatot Lista. Vessünk egy pillantást néhányukra.

4.2. Tömb lista Konstruktőr

A legegyszerűbb megközelítés a másoláshoz a Lista olyan konstruktort használ, amely a Gyűjtemény paraméter:

Lista forrása = Arrays.asList (11, 22, 33); Lista rendeltetési hely = új ArrayList (forrás);

Itt egyszerűen átadjuk a forráslistát a céllista konstruktorának, amely létrehoz egy sekély másolatot a forráslistáról.

A céllista csak egy újabb hivatkozás lesz ugyanarra az objektumra, amelyre a forráslista hivatkozik. Tehát minden hivatkozás által végrehajtott változás ugyanazt az objektumot érinti.

Ezért a konstruktor használata jó lehetőség az olyan változhatatlan objektumok másolására, mint például Egész számok és Húrok.

4.3. az összes hozzáadása

Egy másik egyszerű módszer a az összes hozzáadása a metódusa Lista:

Lista rendeltetési hely = new ArrayList (); destination.addAll (forrás);

Az addAll metódus a forráslista összes elemét átmásolja a céllistára.

Néhány megközelítést érdemes megjegyezni ezzel a megközelítéssel kapcsolatban:

  1. Létrehoz egy sekély másolatot a forráslistáról.
  2. A forráslista elemei a céllistához vannak csatolva.

4.4. Java 8 Patakok

A Java 8 bemutatta a Stream API-t, amely remek eszköz a Java-val való együttműködéshez Gyűjtemények.

Használni a folyam() módszerrel a Stream API használatával készítünk egy másolatot a listáról:

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

4.5. Java 10

Másolás a Lista még egyszerűbb a Java 10-ben. A másolata() A módszer lehetővé teszi számunkra, hogy létrehozhatunk egy változhatatlan listát, amely tartalmazza az adott elem elemeit Gyűjtemény:

Lista rendeltetési hely = List.copyOf (sourceList);

Ha ezzel a megközelítéssel akarunk menni, akkor meg kell győződnünk arról, hogy mi a bevitel Lista nem nulla és hogy nem tartalmaz semmit nulla elemek.

5. Következtetés

Ebben a cikkben megvizsgáltuk, hogyan és miért a Gyűjtemények.másolat módszer dob IndexOutOfBoundException “A forrás nem fájl a célba”. Vele együtt megvizsgáltuk az a másolásának különböző módjait is Lista másiknak Lista.

A Java-10 előtti és a Java 10 példák egyaránt megtalálhatók a GitHubon.