Java Academy · leksjon

Fallgruver ved autoboksing

Null-avboksing og feller med ==

Leksjon 4 av 413 trinn

Fallgruver ved autoboksing er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Bekvemmelighet har fallgruver

Autoboxing gjør koden ryddigere, men skjuler konverteringer som kan føre til overraskende feil. De to største fallgruvene er unboxing av null og identitetssammenligning med ==.

Denne leksjonen viser hvordan De unngår begge.

Fallgruven med unboxing av null

Hvis en wrapper inneholder null og De pakker den ut til en primitiv, kaster Java et NullPointerException.

Dette er lett å overse fordi koden ser ut som en enkel tilordning.

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 i aritmetikk

Fallgruven finnes også inne i uttrykk. Hvis De legger til en null-wrapper, pakkes den først ut, og dette kaster et unntak før beregningen i det hele tatt starter.

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!");
        }
    }
}

Beskyttelse mot null

Kontroller alltid om en wrapper er null før De pakker den ut, eller oppgi en standardverdi.

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

Overraskelsen med == og hurtigbufferen

Integer.valueOf hurtigbufrer verdier fra -128 til 127. To innpakkede verdier i dette området kan derfor dele samme objekt, og == returnerer true.

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

Utenfor hurtigbufferen

Over hurtigbufferområdet oppretter hver innpakking et eget objekt. Da sammenligner == referanser og returnerer false, selv om tallene er like.

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

Bruk alltid equals

Fordi == på wrapper-objekter sammenligner objektidentitet, må du bruke .equals() for å sammenligne de faktiske tallverdiene.

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

Blanding av == med en primitiv datatype

Hvis den ene siden av == er en primitiv datatype, opphever Java wrapperen, slik at sammenligningen skjer på verdi. Dette er pålitelig, men kan fortsatt utløse et unntak hvis wrapperen er null.

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

Skjult boxing i løkker

Hvis du deklarerer en løkkeakkumulator som en wrapper, opprettes et nytt objekt i hver iterasjon. Nedenfor ville bruk av Long i stedet for long ført til gjentatt boxing. Foretrekk den primitive datatypen.

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 returnerer null

En vanlig feil i virkelige programmer er at Map.get returnerer null når en nøkkel mangler. Hvis dette resultatet unboxes til en int, utløses et unntak. Bruk getOrDefault i stedet.

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);
    }
}

Unngå feil

To vaner forhindrer de fleste feil med autoboxing: Unbox aldri en verdi som kan være null, og sammenlign alltid wrapper-verdier med .equals() i stedet for ==.

Hurtigsjekk

Test hvor godt du kjenner fallgruvene ved autoboxing.

Oppsummering

Du har lært om de viktigste fallgruvene ved autoboxing:

  • Unboxing av en null-wrapper utløser en NullPointerException
  • Beskytt deg med en null-sjekk eller en standardverdi
  • == på wrapper-objekter sammenligner referanser, med caching fra -128 til 127
  • Bruk alltid .equals() for verdisammenligning
  • Bruk getOrDefault for å unngå null ved oppslag i kart
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Fallgruver ved autoboksing» gratis?

Ja – hele teksten i «Fallgruver ved autoboksing» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Fallgruver ved autoboksing»?

Null-avboksing og feller med == Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Fallgruver ved autoboksing»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Primitive typer kontra wrapper-typer
  2. Autoboksing og avboksing
  3. Parsing og Valueof
  4. Fallgruver ved autoboksing
← Tilbake til Java Academy