Autoboxingin sudenkuopat
Null-unboxing ja ==-ansat
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 aiheuttaaNullPointerException-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
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
- Primitiivi- ja wrapper-tyypit
- Autoboxing ja unboxing
- Jäsentäminen ja Valueof
- Autoboxingin sudenkuopat