Valkuilen van autoboxing
Null-unboxing en valkuilen met ==
Valkuilen van autoboxing is een gratis Java Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Gemak heeft valkuilen
Autoboxing maakt code overzichtelijker, maar verbergt conversies die verrassende fouten kunnen veroorzaken. De twee grootste valkuilen zijn unboxing van null en identiteitsvergelijking met ==.
In deze les leer je beide te vermijden.
De valkuil van null bij unboxing
Als een wrapper null bevat en je deze uitpakt naar een primitief type, veroorzaakt Java een NullPointerException.
Dit is gemakkelijk over het hoofd te zien, omdat de code eruitziet als een eenvoudige toewijzing.
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 bij berekeningen
De valkuil doet zich ook voor in expressies. Bij het optellen van een wrapper met null wordt deze eerst uitgepakt, waardoor een uitzondering ontstaat voordat de berekening zelfs maar wordt uitgevoerd.
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!");
}
}
}Bescherming tegen null
Controleer een wrapper altijd op null voordat je deze uitpakt, of geef een standaardwaarde op.
public class Main {
public static void main(String[] args) {
Integer maybe = null;
int safe = (maybe != null) ? maybe : 0;
System.out.println(safe);
}
}De verrassing van de ==-cache
Integer.valueOf bewaart waarden van -128 tot en met 127 in de cache. Twee ingepakte waarden binnen dat bereik kunnen dus hetzelfde object delen, waardoor == true teruggeeft.
public class Main {
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
}
}Buiten de cache
Boven het cachebereik maakt elke boxing-bewerking een afzonderlijk object. Nu vergelijkt == verwijzingen en geeft het false terug, ook al zijn de getallen gelijk.
public class Main {
public static void main(String[] args) {
Integer a = 200;
Integer b = 200;
System.out.println(a == b);
}
}Gebruik altijd equals
Omdat == bij wrappers de objectidentiteit vergelijkt, moet je .equals() gebruiken om de werkelijke numerieke waarden te vergelijken.
public class Main {
public static void main(String[] args) {
Integer a = 200;
Integer b = 200;
System.out.println(a.equals(b));
}
}== combineren met een primitief type
Als één kant van == een primitief type is, unboxt Java de wrapper, zodat de vergelijking op waarde gebeurt. Dit is betrouwbaar, maar kan nog steeds een fout veroorzaken als de wrapper null is.
public class Main {
public static void main(String[] args) {
Integer a = 200;
int b = 200;
System.out.println(a == b);
}
}Verborgen boxing in lussen
Als je een accumulator voor een lus als wrapperklasse declareert, ontstaat er bij elke iteratie een nieuw object. Hieronder zou het gebruik van Long in plaats van long herhaaldelijk boxing veroorzaken. Geef de voorkeur aan het primitieve type.
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 retourneert null
Een veelvoorkomende bug uit de praktijk: Map.get retourneert null voor een ontbrekende sleutel. Als je dat resultaat naar een int unboxt, ontstaat er een fout. Gebruik in plaats daarvan getOrDefault.
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);
}
}Veilig blijven
Twee gewoonten voorkomen de meeste fouten met autoboxing: unbox nooit een waarde die mogelijk null is en vergelijk wrapperwaarden altijd met .equals() in plaats van met ==.
Korte controle
Controleer of je de valkuilen van autoboxing herkent.
Samenvatting
Je hebt de belangrijkste valkuilen van autoboxing geleerd:
- Het unboxen van een
null-wrapper veroorzaakt eenNullPointerException - Bescherm dit met een null-controle of een standaardwaarde
==vergelijkt bij wrappers verwijzingen, waarbij waarden van -128 tot en met 127 uit een cache kunnen komen- Gebruik altijd
.equals()om waarden te vergelijken - Gebruik
getOrDefaultom null bij het opzoeken in een map te voorkomen
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Valkuilen van autoboxing” gratis?
Ja — de volledige tekst van “Valkuilen van autoboxing” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Valkuilen van autoboxing”?
Null-unboxing en valkuilen met == Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Valkuilen van autoboxing”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Primitieve versus wrappertypen
- Autoboxing en unboxing
- Parsen en valueOf
- Valkuilen van autoboxing