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ănullsau foloseșteOptional. - Returnezi
nulldin metode în loc de colecție goală. Cine apelează uită să verifice; returneazăList.of(). - Scrii
oras.equals("Iași")cândoraspoate finull. 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ă.