Optional.orElseThrow în Java

Comparator și Optional Java 10 (varianta cu Supplier: Java 8)

Returnează valoarea sau, dacă Optional-ul e gol, aruncă o excepție: NoSuchElementException sau excepția creată de tine.

Sintaxă
T orElseThrow()
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

Ce face Optional.orElseThrow

orElseThrow() fără argumente returnează valoarea sau aruncă NoSuchElementException. Face același lucru ca get(), dar numele spune clar ce se întâmplă pe gol.

Varianta cu o funcție îți permite să alegi excepția și mesajul: orElseThrow(() -> new IllegalArgumentException("Produs inexistent: " + cod)). Este potrivită când lipsa valorii este o eroare reală, pe care codul de mai sus trebuie să o afle.

Parametri

Parametru Descriere
exceptionSupplier Funcția care creează excepția aruncată.

Ce returnează

Valoarea din Optional.

Exemple

Exemplul 1: Valoarea trebuie să existe

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> note = List.of(8, 10, 6);
        int maxima = note.stream().max(Integer::compare).orElseThrow();
        System.out.println("Maxima: " + maxima);
    }
}

Rezultat

Maxima: 10

Exemplul 2: Excepție cu mesaj propriu

import java.util.Map;
import java.util.Optional;

public class Main {
    static final Map<String, Double> preturi = Map.of("P1", 24.5, "P2", 9.9);

    static double pret(String cod) {
        return Optional.ofNullable(preturi.get(cod))
                .orElseThrow(() -> new IllegalArgumentException("Produs inexistent: " + cod));
    }

    public static void main(String[] args) {
        System.out.println(pret("P1"));
        try {
            System.out.println(pret("P7"));
        } catch (IllegalArgumentException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

24.5
Eroare: Produs inexistent: P7

Greșeli frecvente

  • Folosești orElseThrow când lipsa valorii este normală (de exemplu un câmp opțional). Folosește orElse cu o valoare implicită.
  • Scrii orElseThrow(new Exceptie(...)). Metoda cere o funcție: orElseThrow(() -> new Exceptie(...)).

Comenzi înrudite

  • Optional.orElse: orElse returnează valoarea sau o rezervă dată; orElseGet calculează rezerva cu o funcție, doar când e nevoie.
  • Optional.isPresent: isPresent() spune dacă Optional-ul conține o valoare, isEmpty() dacă e gol; get() returnează valoarea sau aruncă excepție.
  • 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.