Исключение при пустом контейнере в Java
Когда отсутствие значения считают ошибкой, вызывают
orElseThrow. На непустом контейнере метод
работает как get. На пустом бросает
NoSuchElementException или исключение из
переданного поставщика.
Вариант без аргумента подходит, если достаточно стандартного сообщения:
import java.util.Optional;
Optional<String> role = Optional.of("admin");
System.out.println(role.orElseThrow());
Optional<String> gap = Optional.empty();
// gap.orElseThrow(); // NoSuchElementException
Через лямбду задают свой тип и текст:
import java.util.Optional;
Optional<Integer> id = Optional.empty();
int value = id.orElseThrow(
() -> new IllegalStateException("id missing")
);
Такой прием уместен в конце цепочки, когда пустота уже означает нарушение контракта, а не обычный «не нашли».
Метод int requirePositive(Optional<Integer> n):
верните число с
IllegalArgumentException и текстом
"not a number", если контейнер пуст.