NullPointerException în Java

Apare când folosești o referință null ca pe un obiect (apelezi o metodă, citești un câmp); mesajul spune ce era null.

Sintaxă
public class NullPointerException extends RuntimeException

Objects.requireNonNull(obiect, "mesaj")

Ce face NullPointerException

O variabilă de tip obiect poate conține null: „niciun obiect”. Dacă apelezi o metodă pe ea (nume.length()), citești un câmp, iei lungimea unui tablou null sau desfaci automat un Integer null în int, programul aruncă NullPointerException (NPE).

Din Java 14, mesajul este „util”: spune exact ce operație a eșuat și ce era null, de exemplu Cannot invoke "String.length()" because the return value of "Main.gaseste(String)" is null.

Ca să eviți NPE: verifici cu if (x != null), folosești Optional pentru valori care pot lipsi, Objects.requireNonNullElse(x, implicit) sau compari cu constanta în față: "Iași".equals(oras). Objects.requireNonNull(x, "mesaj") aruncă NPE devreme, cu mesajul tău, când un parametru obligatoriu lipsește.

Ce returnează

Nu se creează de obicei manual; o aruncă mașina virtuală sau Objects.requireNonNull.

Exemple

Exemplul 1: Mesajul util al unei NPE

import java.util.Map;

public class Main {
    static final Map<String, String> JUDETE = Map.of("Iași", "IS", "Cluj", "CJ");

    static String gaseste(String oras) {
        return JUDETE.get(oras);
    }

    public static void main(String[] args) {
        System.out.println("Iași -> " + gaseste("Iași").toLowerCase());
        try {
            System.out.println("Brașov -> " + gaseste("Brașov").toLowerCase());
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
        }
    }
}

Rezultat

Iași -> is
Cannot invoke "String.toLowerCase()" because the return value of "Main.gaseste(String)" is null

Exemplul 2: Cum eviți NPE

import java.util.Objects;
import java.util.Optional;

public class Main {
    static String telefon = null;

    public static void main(String[] args) {
        System.out.println("equals cu constanta în față: " + "Iași".equals(telefon));
        System.out.println("Valoare implicită: " + Objects.requireNonNullElse(telefon, "fără telefon"));
        System.out.println("Optional: " + Optional.ofNullable(telefon).map(String::strip).orElse("necunoscut"));
        try {
            Objects.requireNonNull(telefon, "telefonul este obligatoriu");
        } catch (NullPointerException e) {
            System.out.println("requireNonNull: " + e.getMessage());
        }
    }
}

Rezultat

equals cu constanta în față: false
Valoare implicită: fără telefon
Optional: necunoscut
requireNonNull: telefonul este obligatoriu

Exemplul 3: Integer null desfăcut în int

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

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> note = new HashMap<>();
        note.put("Ana", 9);
        try {
            int nota = note.get("Mihai");
            System.out.println(nota);
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
        }
        int sigur = note.getOrDefault("Mihai", 0);
        System.out.println("Cu getOrDefault: " + sigur);
    }
}

Rezultat

Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is null
Cu getOrDefault: 0

Greșeli frecvente

  • Prinzi NullPointerException în loc să verifici valoarea. Verifică null sau folosește Optional.
  • Returnezi null din metode în loc de colecție goală. Cine apelează uită să verifice; returnează List.of().
  • Scrii oras.equals("Iași") când oras poate fi null. Scrie "Iași".equals(oras).

Comenzi înrudite

  • Optional: O „cutie” care conține o valoare sau este goală. Arată clar că un rezultat poate lipsi și te obligă să tratezi cazul, în loc de null.
  • RuntimeException: Clasa de bază a excepțiilor neverificate: nu trebuie declarate cu throws și nici prinse obligatoriu.
  • IllegalArgumentException: Excepția aruncată când o metodă primește un argument cu valoare nepermisă (vârstă negativă, lună 13).
  • Objects.requireNonNull: requireNonNull() oprește imediat cu un mesaj clar dacă o valoare este null; requireNonNullElse() înlocuiește null cu o valoare implicită.