Java Academy · Oppitunti

Autoboxingin sudenkuopat

Null-unboxing ja ==-ansat

Oppitunti 4/413 vaihetta

Autoboxingin sudenkuopat on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Kätevyydessä on sudenkuoppia

Autoboxing tekee koodista siistimpää, mutta piilottaa muunnoksia, jotka voivat aiheuttaa yllättäviä virheitä. Kaksi suurinta sudenkuoppaa ovat null-arvon purkaminen ja identiteetin vertaaminen operaattorilla ==.

Tässä oppitunnissa opitte välttämään molemmat.

Null-arvon purkamisen sudenkuoppa

Jos kääreluokan arvona on null ja puratte sen primitiiviksi, Java aiheuttaa NullPointerException-poikkeuksen.

Tämä jää helposti huomaamatta, koska koodi näyttää tavalliselta sijoitukselta.

public class Main {
    public static void main(String[] args) {
        Integer maybe = null;
        try {
            int value = maybe;
            System.out.println(value);
        } catch (NullPointerException e) {
            System.out.println("Cannot unbox null!");
        }
    }
}

Null aritmetiikassa

Sudenkuoppa tulee vastaan myös lausekkeiden sisällä. null-arvon sisältävä kääreluokka puretaan ensin, mikä aiheuttaa poikkeuksen ennen kuin laskutoimitus ehtii edes alkaa.

public class Main {
    public static void main(String[] args) {
        Integer count = null;
        try {
            int total = count + 5;
            System.out.println(total);
        } catch (NullPointerException e) {
            System.out.println("Null in arithmetic!");
        }
    }
}

Null-arvoilta suojautuminen

Tarkistakaa aina, onko kääreluokan arvo null, ennen kuin puratte sen, tai antakaa oletusarvo.

public class Main {
    public static void main(String[] args) {
        Integer maybe = null;
        int safe = (maybe != null) ? maybe : 0;
        System.out.println(safe);
    }
}

==-välimuistin yllätys

Integer.valueOf tallentaa välimuistiin arvot väliltä -128–127. Siksi kaksi tällä välillä olevaa käärittyä arvoa voi jakaa saman olion, jolloin == palauttaa arvon true.

public class Main {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        System.out.println(a == b);
    }
}

Välimuistin ulkopuolella

Välimuistin arvoalueen yläpuolella jokainen boxing luo erillisen olion. Tällöin == vertaa viitteitä ja palauttaa arvon false, vaikka luvut ovat yhtä suuret.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b);
    }
}

Käyttäkää aina equals-metodia

Koska == vertailee wrapper-olioiden identiteettiä, todellisia numeerisia arvoja on verrattava .equals()-metodilla.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a.equals(b));
    }
}

==-vertailu primitiivin kanssa

Kun toinen ==-operaattorin operandeista on primitiivi, Java purkaa wrapperin automaattisesti, joten vertailu tehdään arvon perusteella. Tämä on luotettavaa, mutta voi silti aiheuttaa poikkeuksen, jos wrapperin arvo on null.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        int b = 200;
        System.out.println(a == b);
    }
}

Piilevä boxing silmukoissa

Silmukan kertymämuuttujan määrittäminen wrapper-tyypiksi luo uuden olion jokaisella iteraatiolla. Alla Long-tyypin käyttäminen long-tyypin sijaan aiheuttaisi toistuvaa boxingia. Suosikaa primitiiviä.

public class Main {
    public static void main(String[] args) {
        long sum = 0;
        for (int i = 0; i < 1000; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}

Map.get palauttaa null-arvon

Yleinen käytännön virhetilanne: puuttuvan avaimen kohdalla Map.get palauttaa null-arvon. Tämän tuloksen purkaminen int-tyypiksi aiheuttaa poikkeuksen. Käyttäkää sen sijaan getOrDefault-metodia.

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        int score = scores.getOrDefault("missing", 0);
        System.out.println(score);
    }
}

Turvallinen käyttö

Kaksi tapaa estää useimmat autoboxing-virheet ovat seuraavat: älkää koskaan purkako arvoa, joka saattaa olla null, ja verratkaa wrapper-arvoja aina .equals()-metodilla ==-operaattorin sijaan.

Pikatesti

Testatkaa, tunnistatteko autoboxingin sudenkuopat.

Kertaus

Opitte autoboxingin tärkeimmät sudenkuopat:

  • null-arvon purkaminen wrapperista aiheuttaa NullPointerException-poikkeuksen
  • Suojatkaa koodi null-tarkistuksella tai oletusarvolla
  • Wrapperien ==-vertailu vertailee viitteitä, ja arvot -128–127 välimuistitetaan
  • Käyttäkää arvojen vertailuun aina .equals()-metodia
  • Käyttäkää getOrDefault-metodia, jotta karttahaut eivät palauta null-arvoa
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Autoboxingin sudenkuopat” ilmainen?

Kyllä – oppitunnin ”Autoboxingin sudenkuopat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Autoboxingin sudenkuopat”?

Null-unboxing ja ==-ansat Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Autoboxingin sudenkuopat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Primitiivi- ja wrapper-tyypit
  2. Autoboxing ja unboxing
  3. Jäsentäminen ja Valueof
  4. Autoboxingin sudenkuopat
← Takaisin: Java Academy