Objects.requireNonNull în Java

requireNonNull() oprește imediat cu un mesaj clar dacă o valoare este null; requireNonNullElse() înlocuiește null cu o valoare implicită.

Sintaxă
static <T> T requireNonNull(T obj)
static <T> T requireNonNull(T obj, String mesaj)
static <T> T requireNonNullElse(T obj, T implicit)   // Java 9

Ce face Objects.requireNonNull

Objects.requireNonNull(obj, mesaj) returnează obj dacă nu este null; altfel aruncă NullPointerException cu mesajul dat. Se folosește la începutul constructorilor și metodelor, ca eroarea să apară imediat, la locul unde s-a primit valoarea greșită, nu mai târziu, într-un loc greu de găsit.

Objects.requireNonNullElse(obj, implicit) (Java 9) returnează obj dacă nu este null, altfel implicit. Valoarea implicită nu poate fi ea însăși null (ar arunca excepție). Există și requireNonNullElseGet, care calculează valoarea implicită doar când e nevoie.

Parametri

Parametru Descriere
obj Valoarea verificată.
mesaj Mesajul excepției, dacă obj este null.
implicit Valoarea folosită în locul lui null.

Ce returnează

Chiar obj (sau implicit), ca să poată fi folosit direct într-o atribuire.

Exemple

Exemplul 1: Validare în constructor

import java.util.Objects;

public class Main {
    static class Comanda {
        final String client;
        final String adresa;

        Comanda(String client, String adresa) {
            this.client = Objects.requireNonNull(client, "clientul este obligatoriu");
            this.adresa = Objects.requireNonNull(adresa, "adresa este obligatorie");
        }
    }

    public static void main(String[] args) {
        Comanda ok = new Comanda("Ana", "Iași");
        System.out.println("Comandă pentru " + ok.client);
        try {
            new Comanda("Ion", null);
        } catch (NullPointerException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

Comandă pentru Ana
Eroare: adresa este obligatorie

Exemplul 2: Valoare implicită pentru null

Ultimul apel are și valoarea implicită null; mesajul excepției este defaultObj, numele parametrului din JDK.

import java.util.Map;
import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        Map<String, String> orase = Map.of("Ana", "Iași", "Ion", "Cluj");
        for (String nume : new String[] {"Ana", "Maria"}) {
            String oras = Objects.requireNonNullElse(orase.get(nume), "necunoscut");
            System.out.println(nume + ": " + oras);
        }
        try {
            Objects.requireNonNullElse(null, null);
        } catch (NullPointerException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

Ana: Iași
Maria: necunoscut
Eroare: defaultObj

Greșeli frecvente

  • Apelezi requireNonNull și ignori rezultatul, apoi folosești altă variabilă. Metoda nu „repară” nimic, doar verifică; folosește valoarea returnată.
  • Construiești un mesaj scump (cu concatenări) la fiecare apel: există varianta requireNonNull(obj, () -> "mesaj " + x), care construiește mesajul doar la eroare.

Comenzi înrudite

  • Objects: Clasa java.util.Objects are metode statice care lucrează sigur cu null; equals() compară două obiecte care pot fi null.
  • Objects.toString: Transformă un obiect în text fără să arunce excepție pentru null: dă „null” sau textul ales de tine.
  • System.getenv: Citește variabilele de mediu ale sistemului (PATH, HOME sau setări proprii ca DB_URL); null dacă variabila nu există.
  • Constructori: Constructorul are numele clasei, nu are tip returnat și pregătește obiectul nou; o clasă poate avea mai mulți constructori.